参照源码
问题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");
}
}
}