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");
}
}