Struts2的配置 struts.xml Action详解
在学习struts的时候,我们一定要掌握struts2的工作原理。只有当我们明确了在struts2框架的内部架构的实现过程,在配置整个struts 的框架时,可以很好的进行逻辑上的配置。接下来我就先简单的讲解下struts2的框架工作原理: 一、struts2的工作原理 1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求; 二、部署一个struts2项目的一般步骤 1)在Myeclipse中创建一个web项目,并将struts2需要的jar包导入进项目中,如下图 2)在项目中的web.xml中进行配置struts2的框架,在web.xml中需要包含在<filter></filter>,在该节点下可以包含<filter-name>和<filter-mapin <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" 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_3_0.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> </web-app> 3)编写Action类 三、struts.xml的配置初探 先来看看struts的基本配置的大概情况 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <package name="user" namespace="/" extends="struts-default"> <action name="*user" class="com.zzjmay.action.VaildateAction" method="{1}"> <result name="success">/success.jsp</result> <result name="input">/{1}.jsp</result> </action> </package> </struts> 从上面的代码中可以看出,xml中包含的再根节点下<struts></struts>下。在实际项目中的编写时,头部信息需要更改,那么我们给以在导入的jar中的jar包中进行获取 在struts-core-2.2.1.1.jar包下的struts2.0.dtd中进行获取。 四、struts.xml中的package的配置 看着前面的代码可以很清晰的看到package的属性 属性有: 1. name:逻辑上的包名 具体使用过程中要注意,有与命名空间的命名,我们要在相应的过程中加上对应的命名空间的路径,例如: <s:form action="db/login.action" method="post"> 此代码说明的就是将会去调用db命名空间下的login对应的action 还需要注意的是: <result>标签的下的是物理路径(绝对路径),即指在项目中的实际位置,代码如下 <result name="success">/login/error.jsp</result> 六、struts.xml中的result的配置 对于action的配置我这里面只是简单的概括,具体很多细节性的东西我将专门写一篇博客,主要讲解的动态的对action进行配置 属性有: 1. name:Action类的映射名称 七、struts.xml配置过程中的注意信息 在实际开发的项目中,我们可能需要配置很多的action,有时候为了便于我们的分类,我们一般需要创建不同包下的struts-user.xml文件,不过最终我们的这些配置都是要导入进我们的struts.xml文件中。使用的标签和jsp编程中<include> struts.xml [<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <include file="struts-user.xml"></include> </struts> struts-user.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <constant name="struts.ui.theme" value="simple"></constant> <package name="user" namespace="/ss" extends="struts-default"> <action name="login" class="com.zzjmay.action.UserAction" method="execude2"> <!--result下的路径是物理路径 --> <result name="success">/login/success.jsp</result> <result name="error">/login/error.jsp</result> </action> </package> <!-- 包名不能相同 --> <package name="user123" namespace="/db" extends="struts-default"> <action name="login" class="com.zzjmay.action.UserAction" method="execude2"> <!--result下的路径是物理路径 --> <result name="success">/login/error.jsp</result> <result name="error">/login/success.jsp</result> </action> </package> </struts> 一、Action的创建方法 1)实现Action接口 二、Action动态方法的调用 在实际的项目中,一个action类的中,可能存在多个方法,而不同的方法执行的效果是不一样的,如果按照了一般性的配置,将无形的增加了程序员的负担 第一种方法:在struts.xml中的action属性标签中用method属性指定方法名(不怎么推荐使用) 第二种方法: jsp页面中指定你要调用的那个方法 <form action=”login!myfun.action”,method=”post”> 在客户端请求中进行动态的配置:映射名!方法名.action 这样可以动态的调用action中的myfun方法,就不要在action标签中进行method的配置 第三种方法:使用通配符进行配置(推荐使用:适用情况当一个类中存在较多的响应方法) 在配置<action> 时,可以在 name,class,method 中使用通配符,这是 另外一种形式的动态方法调用 <action name="*user" class="com.zzjmay.action.UserAction" method="{1}"> //这种通配是针对的是同一个action中,响应不同的方法 在jsp页面中调用的时候 <form action="loginuser.action" method="post"> <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 --> 用户名:<input type="text" name="username" id="username"><br> 密 码:<input type="password" name="password" id="password"> <br> <input type="submit" value="提交"> </form> 注意:通过使用通配符的时候相当于占位操作,其中的{1}表示第一个通配符,就上面的例子来讲,当jsp页面中是loginuser.action进行调用的时候,实际上出发的Action类中的login()方法 通过通配符实现,不同的类响应不同的类中的方法: <action name=“*_*" class="action.{1}Action" method="{2}"> <result >/{2}.jsp</result> </action> 三、 Action的动态结果的配置 含义:在实际运行当中,Action类的处理业务的过程中,可能由于业务条件的复杂,会跳转到不同页面,那么为了节省result的配置,我们一般会采用动态结果的配置。其实很像我们在servlet中进行全局的forward的配置。 UserAction.Java public class UserAction extends ActionSupport { private String nextResult; ... } Struts2.xml <action name="user" class="action.UserAction"> <result>/{nextResult}</result> </action> 四、接收用户数据(推荐使用的实现ModelDriven的接口) 在这篇博客中我只是介绍常用的,并且在实际项目中效率较高的方法。我之所以推荐ModelDriven接口的方法,原因就是可以很好的分离显示界面和业务逻辑的分离(解耦性)。 实现ModelDriven接口 步骤: 注意: UserAction.java public class UserAction implements ModelDriven<User> { //要实例化 private User user=new User(); public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String myfun() throws Exception { System.out.println("username="+user.getUsername()); System.out.println("password="+user.getPassword()); System.out.println("myfun....."); //用来进行处理 if(user.getUsername().equals(user.getPassword())){ return "success"; }else{ return "error"; } } public User getModel() { // TODO Auto-generated method stub return user; } } login.jsp <form action="loginuser.action" method="post"> <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 --> 用户名:<input type="text" name="username" id="username"><br> 密 码:<input type="password" name="password" id="password"> <br> <input type="submit" value="提交"> </form> 五、在Action中访问Servlet API 访问Servlet API的实际项目中有两种的方法访问Servlet API 1)解耦的方法(实现三大接口程序RequestAware,ApplicationAware,SessionAware) public class UserAction2 implements ModelDriven<User>,RequestAware,SessionAware,ApplicationAware{ private User user = new User(); private Map<String,Object> requestMap; private Map<String,Object> sessionMap; private Map<String,Object> applicationMap; public void setApplication(Map<String,Object> applicationMap) { this.applicationMap=applicationMap; } public void setSession(Map<String,Object> sessionMap) { this.sessionMap=sessionMap; } public void setRequest(Map<String,Object> requestMap) { this.requestMap=requestMap; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String myfun() throws Exception { System.out.println("username=" + user.getUsername()); System.out.println("password=" + user.getPassword()); System.out.println("myfun2....."); // 用来进行处理 if (user.getUsername().equals(user.getPassword())) { sessionMap.put("Succ","成功的哇2!!!"); Bookbiz bookbiz=new Bookbiz(); applicationMap.put("books",bookbiz.getBooks()); return "success"; } else { requestMap.put("errorMsg","登陆失败了2"); return "error"; } } public User getModel() { // TODO Auto-generated method stub return user; } 注意:在非解耦的方式中,struts2框架已经将对应的四大应用作用域给封装到了Map集合中,所以这里一开始定义的三个Map集合中可以相当于操作四大作用域对象 2)非解耦的方法(实现两大接口程序ServletReuqestAware,ServletContextAware):非解耦的意思就是说直接操作的Servlet API对象 public class UserAction4 implements ModelDriven<User>,ServletRequestAware,ServletContextAware{ private User user = new User(); private HttpServletRequest request; private HttpSession session; private ServletContext application; public void setServletContext(ServletContext application) { this.application = application; } public void setServletRequest(HttpServletRequest request) { this.request = request; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } ……………… 注意:在实现接口中只实现了request和application的获取 在实际项目开发当中,需要的获取session的方法是通过Httpsession session= request.getsession(); 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |