1.过滤器Filter
- 对页面传回的内容进过滤,并设置编码,防止出现中文乱码问题
- 【CharacterEncodingFilter.java】
package com.javaweb.qqzone.myssm.filters;
import com.javaweb.qqzone.myssm.util.StringUtil;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter(urlPatterns = {"*.do"},initParams = {@WebInitParam(name = "encoding", value = "UTF-8")})
public class CharacterEncodingFilter implements Filter {
private String encoding = "UTF-8";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String encodingStr = filterConfig.getInitParameter("encoding");
if (StringUtil.isNotEmpty(encodingStr)) {
encoding = encodingStr;
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
((HttpServletRequest)servletRequest).setCharacterEncoding(encoding);
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
- 对所有的前端请求进行过滤,且进行业务管理
- 【OpenSessionInViewFilter.java】
package com.javaweb.qqzone.myssm.filters;
import com.javaweb.qqzone.myssm.transaction.TransactionManager;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.sql.SQLException;
@WebFilter("*.do")
public class OpenSessionInViewFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
try {
TransactionManager.beginTrans();
System.out.println("开启事务....");
filterChain.doFilter(servletRequest,servletResponse);
TransactionManager.commit();
System.out.println("提交事务....");
} catch (Exception e) {
e.printStackTrace();
try {
TransactionManager.rollback();
System.out.println("回滚事务....");
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
@Override
public void destroy() {
}
}
2.异常处理
- 对
DAO
层的异常信息进行处理 - 【DAOException.java】
public class DAOException extends RuntimeException{
public DAOException(String msg) {
super(msg);
}
}
- 对
DispatcherServlet
的异常信息进行处理 - 【DispatcherException .java】
public class DispatcherException extends RuntimeException{
public DispatcherException(String msg) {
super(msg);
}
}
3.Servlet通用模块
- 对
thymeleaf
的相关处理 - 【ViewBaseServlet .java】
package com.javaweb.qqzone.myssm.myspingmvc;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ViewBaseServlet extends HttpServlet {
private TemplateEngine templateEngine;
@Override
public void init() throws ServletException {
ServletContext servletContext = this.getServletContext();
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);
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");
templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
}
protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html;charset=UTF-8");
WebContext webContext = new WebContext(req, resp, getServletContext());
templateEngine.process(templateName, webContext, resp.getWriter());
}
}
- 中央控制器
- 【DispatcherServlet .java】
package com.javaweb.qqzone.myssm.myspingmvc;
import com.javaweb.qqzone.myssm.exception.DispatcherException;
import com.javaweb.qqzone.myssm.ioc.BeanFactory;
import com.javaweb.qqzone.myssm.util.StringUtil;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
@WebServlet("*.do")
public class DispatcherServlet extends ViewBaseServlet {
private BeanFactory beanFactory;
public DispatcherServlet() {
}
public void init() throws ServletException {
super.init();
ServletContext application = getServletContext();
Object beanFactoryObj = application.getAttribute("beanFactory");
if (beanFactoryObj != null) {
beanFactory = (BeanFactory) beanFactoryObj;
} else {
throw new RuntimeException("IOC容器获取失败....");
}
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String servletPath = request.getServletPath();
servletPath = servletPath.substring(1);
int lastDotIndex = servletPath.lastIndexOf(".do");
servletPath = servletPath.substring(0, lastDotIndex);
System.out.println("servletPath=" + servletPath);
Object controllerBeanObj = beanFactory.getBean(servletPath);
String operation = request.getParameter("operation");
if (StringUtil.isEmpty(operation)) {
operation = "index";
}
try {
Method[] methods = controllerBeanObj.getClass().getDeclaredMethods();
for (Method method : methods) {
if (operation.equals(method.getName())){
Parameter[] parameters = method.getParameters();
Object[] parameterValues = new Object[parameters.length];
for (int i = 0; i < parameters.length; i++) {
Parameter parameter = parameters[i];
String parameterName = parameter.getName();
if ("request".equals(parameterName)) {
parameterValues[i] = request;
} else if ("response".equals(parameterName)) {
parameterValues[i] = response;
} else if ("session".equals(parameterName)){
parameterValues[i] = request.getSession();
} else {
String parameterValue = request.getParameter(parameterName);
Object parameterObj = parameterValue;
String typeName = parameter.getType().getName();
if (parameterObj != null) {
if ("java.lang.Integer".equals(typeName) ) {
parameterObj = Integer.parseInt(parameterValue);
}
}
parameterValues[i] = parameterObj;
}
}
method.setAccessible(true);
Object methodReturnObj = method.invoke(controllerBeanObj,parameterValues);
String methodReturnStr = (String) methodReturnObj;
if (methodReturnStr.startsWith("redirect:")) {
String redirectStr = methodReturnStr.substring("redirect:".length());
response.sendRedirect(redirectStr);
} else {
super.processTemplate(methodReturnStr,request,response);
}
}
}
} catch (Exception e) {
e.printStackTrace();
throw new DispatcherException("DispatcherServlet 出错了");
}
}
}