Servlet优化
一个模块定义一个servlet,模块中所有的功能都是在这一个servlet类来处理
public class BaseServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//获取methodflag的值
String methodflag = request.getParameter("methodflag");
//通过反射机制自动调用功能方法 保证methodflag的值应该跟你要调用方法名称一致
//获取当前类的字节码对象 this=userServlet对象
Class clazz = this.getClass();
//获取你要调用的方法的Method对象
Method method = clazz.getMethod(methodflag, HttpServletRequest.class, HttpServletResponse.class);
//自动调用方法 userServlet对象.login(request,response);
method.invoke(this,request,response);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
@WebServlet(name = "HomeServlet",value = "/home")
public class HomeServlet extends BaseServlet {
//实例化service对象
private HomeService homeService = new HomeServiceImpl();
public void fun1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void fun2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
WebFilter过滤器
登录过滤:
判断所过滤的请求,是否当前是登录状态的,如果不是登录状态的,跳转到登录页面;如果是登录过的,继续之前的操作
@WebFilter(urlPatterns= {"/*"},dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD})
public class LoginValidateFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//真正处理登录验证请求的方法时doFilter
System.out.println("doLoginFilter................");
//判断是否登录 session中是否有登录信息
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
//获取session对象
HttpSession session = request.getSession();
//获取登录信息
User user = (User) session.getAttribute("sessionUser");
//如果user对象不为空 登录过的 如果user为空 没登录过
if(user !=null){
//释放资源的方法
filterChain.doFilter(servletRequest,servletResponse);
}else{
//重定向
String proname = request.getContextPath();
response.sendRedirect(proname+"/forward?methodflag=toLogin");
}
}
@Override
public void destroy() {
}
}
字符编码过滤:
对所有过滤请求路径的request和response设置字符编码
@WebFilter(urlPatterns= {"/*"},dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD},
initParams= {@WebInitParam(name = "encoding", value = "utf-8")})
public class CharacterEncodingFilter implements Filter{
private String encode=null;
/**
* 当前过滤器对象销毁之前会自动此方法做销毁之前的操作 tomcat关闭
*/
public void destroy() {
System.out.println("CharacterEncodingFilter.destroy.......");
encode=null;
}
/**
* 此方法真正处理过滤请求的方法
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("CharacterEncodingFilter.doFilter.......");
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
//响应的对象中文乱码问题
resp.setCharacterEncoding(encode);
//resp.setContentType("text/html;charset="+encode);
req.setCharacterEncoding(encode);
chain.doFilter(request, response);
}
/**
* 当前过滤器对象实例化完成后自动调用该初始化方法做过滤器的初始化操作
* 比如FilterConfig对象获取web.xml配置的初始化参数
*/
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter.init.......");
encode = filterConfig.getInitParameter("encoding");
}
}