1.2版本中分别加入了ActionManager,ActionMapping,ActionMappingManager
首先在ActionServlet中的Init方法中,我们调用ActionMappingManager
中的Init方法解析了xml文件,预先加载了Map中的值
然后在doPost方法中,通过fileName的值,拿到了Map中对应的对象
ActionMapping,通过ActionMapping对象中的actionName属性,
在ActionServlet中我们通过该值创建了对应的Action对象,随后调用
该对象的execute方法,整个流程结束.
ActionManager
public class ActionManager { public Action createAction(String actionName){ try { return (Action) Class.forName(actionName).newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
ActionMapping
实际上就是一个有2个属性的对象,属性分别为name,actionName
分别对应xml文件中的name,class的2个值.
ActionMappingManager
import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class ActionMappingManager { private Map<String,ActionMapping> actionMappings=new HashMap(); public void init(String fileName){ //解析器的创建 SAXReader reader=new SAXReader(); InputStream is=this.getClass().getResourceAsStream("/"+fileName); try { Document doc=reader.read(is); //获得根节点 Element root=doc.getRootElement(); Element actions=root.element("actions"); List<Element> list=actions.elements("action"); for(Element el:list){ ActionMapping actionMapping=new ActionMapping(); actionMapping.setName(el.attributeValue("name")); actionMapping.setActionName(el.attributeValue("class")); actionMappings.put(actionMapping.getName(), actionMapping); } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public Map<String, ActionMapping> getActionMappings() { return actionMappings; } public void setActionMappings(Map<String, ActionMapping> actionMappings) { this.actionMappings = actionMappings; } }
ActionServlet
package com.sun.framework; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.action.LoginAction; import com.sun.framework.ActionMapping; public class ActionServlet extends HttpServlet { /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ Map<String, ActionMapping> actionMappings; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=gbk"); String path=request.getRequestURI(); String actionName=path.substring(path.lastIndexOf("/")+1,path.lastIndexOf(".")); //通过actionName从map拿到对象 ActionMapping actionMapping=actionMappings.get(actionName); //从对象中获得ActionName属性,并且通过create方法获得Action对象 ActionManager actionManager=new ActionManager(); Action action=actionManager.createAction(actionMapping.getActionName()); //执行对应Action对象中的execute方法 String resultView=action.execute(request, response); request.getRequestDispatcher(resultView).forward(request, response); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init(ServletConfig config) throws ServletException { //拿到Servlet初始化参数的值 String fileName=config.getInitParameter("config"); ActionMappingManager actionMappingManager=new ActionMappingManager(); //初始化map actionMappingManager.init(fileName); //拿到map actionMappings=actionMappingManager.getActionMappings(); } }
Struts.xml
<?xml version="1.0" encoding="UTF-8"?> <mystruts> <actions> <action name="login" class="com.sun.action.LoginAction" /> <action name="register" class="com.sun.action.RegisterAction" /> </actions> </mystruts>
Web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>ActionServlet</servlet-name> <servlet-class>com.sun.framework.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>StrutsMvc.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ActionServlet</servlet-name> <url-pattern>*.cc</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
<init-param>为初始化参数
<load-on-startup>为设定该Servlet为第几个加载,即程序启动时加载.