栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

22-05-24 西安 javaweb(09) 整合servlet---ModelBaseServlet

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

22-05-24 西安 javaweb(09) 整合servlet---ModelBaseServlet

为什么要整合servlet?

存在的问题:一个请求对应一个servlet。

解决办法:使用一个servlet处理多个请求,因为一个servlet虚拟路径改不了,所以每次发送请求,携带method请求参数。

添加

有了ModelBaseServlet之后,处理请求的方式:

  1. 创建的servlet需要继承ModelBaseServlet
  2. 每次访问servlet必须携带method请求参数,而method的值一定要和调用的方法名一致
  3. servlet继承ModelBaseServlet时,一定不能重写doGet()和doPost()

对于要调用的方法,方法名已知,参数是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");
    }

 要是点击修改:得先是要回显页面数据 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/930499.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号