反射机制处理MVC中servlet过多问题(向上抽取BaseServlet类)

参照源码

问题1:
现在我们一个请求或者一个独立的业务逻辑都单独进行一个Servlet的创建进行请求处理。
但是一个网站的功能是非常的多,如果每个都创建单独的Servlet进行处理,这样造成
Servlet过多。造成资源浪费。
解决:
服务器在接收到浏览器发送的请求后,会调用对应的Servlet进行请求处理。
然后调用Servlet中的Service方法进行处理。
我们将不同功能的处理封装成对应的方法。
在service方法中调用其对应的功能处理方法进行请求处理。
这样Servlet我们只需要一个。
新的问题:
如何在service方法中实现根据请求动态的调用其功能处理方法呢?
解决:
使用反射。
注意:
请求中需要附带要执行的方法名称。

public class DataServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding(“utf-8”);
//设置响应编码格式
resp.setCharacterEncoding(“text/html;charset=utf-8”);
//获取请求信息
String methodName=req.getParameter(“method”);
System.out.println(“当前请求方法名为:”+methodName);

            //调用方法处理请求(动态根据方法名调用方法===》  反射)
                try {
                    //反射获取方法所在类的对象
                        Class cla=this.getClass();
                    //反射获取要被调用的方法对象
                        Method m=cla.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
                        
                    //反射执行方法
                        m.invoke(this, req,resp);
                } catch (Exception e) {
                    e.printStackTrace();
                }
}

问题2:
现在使用反射我们实现了在service方法中动态的根据请求调用对应的方法进行请求处理。
但是真实开发过程中,虽然不会每个功能都创建一个servlet,但是也不会只使用一个Servlet,我们的Servlet不只是一个,
一般是一个独立的功能模块一个Servlet。我们需要在这些Servlet中的service方法中都要将反射代码声明一遍。
解决:
向上抽取BaseServlet类
实现:
我们自己的Servlet---->
向上抽取父类BaseServlet(service)
注意:我们希望BaseServlet不能被访问到(不能web.xml中配置BaseServlet)
我们希望BaseServlet不能被实例化(改为抽象类)
---->HttpServlet
BaseServlet使用:
1、创建Servlet继承BaseServlet即可。
2、在自己的servlet中不要声明service方法,只要书写请求处理功能方法即可。
3、正常请求我们自己的servlet
注意:
请求必须附带要被执行的方法名

public abstract class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding(“utf-8”);
//设置响应编码格式
resp.setCharacterEncoding(“text/html;charset=utf-8”);
//获取请求信息
String methodName=req.getParameter(“method”);
//System.out.println(“当前请求方法名为:”+methodName);

            //调用方法处理请求(动态根据方法名调用方法===》  反射)
                try {
                    //反射获取方法所在类的对象
                        Class cla=this.getClass();
                    //反射获取要被调用的方法对象
                        Method m=cla.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
                        
                    //反射执行方法
                        m.invoke(this, req,resp);
                } catch (Exception e) {
                    e.printStackTrace();
                }
}

}

public class DataServlet extends BaseServlet {

//登录处理方法
public void userLogin(HttpServletRequest req, HttpServletResponse resp) throws IOException{
    System.out.println("开始处理用户登录请求");
    //获取请求信息
    String uname=req.getParameter("uname");
    String pwd=req.getParameter("pwd");
//处理请求信息
    System.out.println(uname+":"+pwd);
    
    //创建业务层对象
    UserService us=new UserServiceImpl();
    User u=us.getUserInfoService(uname,pwd);
    System.out.println("用户登录查询结果为:"+u);
//响应处理结果
    //创建获取session对象
    HttpSession hs = req.getSession();
    //直接响应
    //请求转发
    //重定向
    if(u!=null){//登录成功
        //将用户信息存储到session
        hs.setAttribute("user", u);
        resp.sendRedirect("/project2/main.jsp");
    }else{//登录失败
        //创建session对象
        
        //将登录失败的标记添加
        hs.setAttribute("flag", "loginFalse");
        resp.sendRedirect("/project2/login.jsp");
    }
}
//退出处理方法
public void userOut(HttpServletRequest req, HttpServletResponse resp) throws IOException{
    System.out.println("开始处理用户退出请求");
    
    //获取session
    HttpSession hs = req.getSession();
    hs.invalidate();//干掉session
    resp.sendRedirect("/project2/login.jsp");
}        
//注册处理方法
public void userReg(HttpServletRequest req, HttpServletResponse resp) throws IOException{
    System.out.println("开始处理用户注册请求");
    
    //获取请求信息
    String uname=req.getParameter("uname");
    String pwd=req.getParameter("pwd");
    String sex=req.getParameter("sex");
    int age=Integer.parseInt(req.getParameter("age"));
    //String age=req.getParameter("age");
    String birthday=req.getParameter("birthday");
//处理请求信息
    //获取业务层对象
    UserService us=new UserServiceImpl();
    //处理注册
    int i=us.regUserInfoService(uname,pwd,sex,age,birthday);
    
//响应处理结果
    //获取session对象
    HttpSession hs = req.getSession();
    
    //重定向
    if(i>0){
        //给注册成功添加标记到session中
        hs.setAttribute("flag", "regSuccess");
        resp.sendRedirect("/project2/login.jsp");
    }else{
        resp.sendRedirect("/project2/login.jsp");
    }
}

}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值