1.为什么会有Struts2这门技术?
以前实现前后端交互都是servlet技术,但是servlet技术有如下几个缺点:
(1).web.xml配置太过繁琐
(2).request,response对象太过依赖容器
(3).只有doGet(),doPost()两个方法
(4).获取前台参数比较麻烦
(5).url处理比较费劲
(6).逻辑都在一个servlet中
2.Servlet变成Struts2转变的第一步:Servlet重构
具体方法:
(1).web.xml中写个过滤器,分离serviceName和methodName(当然,过滤的前提是能监听到事件)
(2).利用反射动态调用service层方法
(3).错误处理机制重构
(1).在web.xml中配置一个监听器和一个过滤器
<listener>
<listener-class>listener.ServiceListener</listener-class>
</listener>
<filter>
<filter-name>servletFilter</filter-name>
<filter-class>filter.servletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>servletFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
(2).写一个具体的监听器(implements ServletContextListener)
public void contextInitialized(ServletContextEvent event){
Map<String,String> map = new HashMap<String,String>();
map.put("userService","service.UserService");
event.getServletContext().setAttribute("map",map);
}
public void contextDestroryed(ServletContextEvent event){
event.getServletContext().removeAttribute("map");
}
(3).写一个方法识别serviceName和methodName
String[] strings = uri.split("/");
getServiceName(String uri)方法:
String serviceName = strings[strings.length-1];
serviceName = serviceName.subString(0,serviceName.indexOf("_"));
return serviceName;
getMethodName(String uri)方法:
String methodName = strings[strings.length-1];
methodName = serviceName.subString(methodName.indexOf("_")+1,methodName.indexOf("."));
return methodName;
(4).写一个过滤器,动态反射serviceName和method(implements Filter)
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain){
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse)response;
String uri = req.getRequestUri();
String serviceName = StringUtils.getServiceName(uri);//(3)中方法
String methodName = StringUtils.getMethodName(uri);//(3)中方法
Map<String,String> map = (HashMap<String,String>)req.getSession().getServletContext().getAttribute("map");
String serviceName = map.get(serviceName);
try{
Class clazz = Class.forName(serviceName);
Method method = clazz.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
String jspName = (String)method.invoke(clazz.newInstance(),req,resp);
req.getRequestDispatcher(jspName).forward(req,resp);
}catch(Exception e){
e.printStackTrace();
}
}