为什么要整合servlet? 存在的问题:一个请求对应一个servlet。
解决办法:使用一个servlet处理多个请求,因为一个servlet虚拟路径改不了,所以每次发送请求,携带method请求参数。
添加
有了ModelBaseServlet之后,处理请求的方式:
对于要调用的方法,方法名已知,参数是HttpServletRequest和HttpServletResponse 此时就可以通过反射动态获取要调用的方法,并且执行方法
public class ModelBaseServlet extends ViewBaseServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //设置编码 request.setCharacterEncoding("UTF-8"); //获取请求参数method的值 String methodName = request.getParameter("method"); //假设methodName的值和调用的方法的方法名一致 Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); //忽略method所对应方法的访问权限 method.setAccessible(true); //执行method所对应的方法 method.invoke(this, request, response); } catch (Exception e) { e.printStackTrace(); } } }
ModelBaseServlet中, 1.获取反射对象,必须用this.getClass(), 2.调用invoke()也只能用this, 3.获取method对象的时候也只能用 HttpServletRequest.class不能用request.getClass() ViewBaseServlet又是啥?
public class ViewBaseServlet extends HttpServlet { private TemplateEngine templateEngine; @Override public void init() throws ServletException { // 1.获取ServletContext对象 ServletContext servletContext = this.getServletContext(); // 2.创建Thymeleaf解析器对象 ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext); // 3.给解析器对象设置参数 // ①HTML是默认模式,明确设置是为了代码更容易理解 templateResolver.setTemplateMode(TemplateMode.HTML); // ②设置前缀 String viewPrefix = servletContext.getInitParameter("view-prefix"); templateResolver.setPrefix(viewPrefix); // ③设置后缀 String viewSuffix = servletContext.getInitParameter("view-suffix"); templateResolver.setSuffix(viewSuffix); // ④设置缓存过期时间(毫秒) templateResolver.setCacheTTLMs(60000L); // ⑤设置是否缓存 templateResolver.setCacheable(true); // ⑥设置服务器端编码方式 templateResolver.setCharacterEncoding("utf-8"); // 4.创建模板引擎对象 templateEngine = new TemplateEngine(); // 5.给模板引擎对象设置模板解析器 templateEngine.setTemplateResolver(templateResolver); } protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException { // 1.设置响应体内容类型和字符集 resp.setContentType("text/html;charset=UTF-8"); // 2.创建WebContext对象 WebContext webContext = new WebContext(req, resp, getServletContext()); // 3.处理模板数据 templateEngine.process(templateName, webContext, resp.getWriter()); } }
最后实现的页面效果list_anchor.html:,这里的序号并不是id
数据库中id并不连续,因为被我删了好几回,哈哈。
list_anchor.html中主要的代码:
可以点击添加,跳转到添加页面add_anchor.html,添加完成后再重定向返回list_anchor.html页面
protected void AddAnchor(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String location = request.getParameter("location"); String hero = request.getParameter("hero"); String terrace = request.getParameter("terrace"); Anchor anchor = new Anchor(null, name, location, hero, terrace); anchorService.AddAnchor(anchor); //添加成功后再展示用户列表功能,重定向到 AnchorServlet(method='getAllAnchor') response.sendRedirect(request.getContextPath()+"/AnchorServlet?method=getAllAnchor"); }
要是点击修改:得先是要回显页面数据
上一篇 添加本地包创建bean时启动异常
下一篇 springmvc,springboot定时任务
版权所有 (c)2021-2022 MSHXW.COM
ICP备案号:晋ICP备2021003244-6号