Struts2基础
1、Struts2是基于MVC的Web应用框架(模型、视图、控制) 一个请求在Struts2框架中的处理大概分为以下几个步骤 (1)、客户端初始化一个指向Servlet容器(例如Tomcat)的请求 (2)、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) (3)、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。 (4)、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy (5)、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。 (6)、ActionProxy创建一个ActionInvocation的实例。 (7)、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 (8)、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是, 也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 2、Struts2=Struts1的知名度和市场+WebWork的技术 3、Struts是Apache下的顶级项目(Apache世界上最大的开源组织) 实现MVC模式,结构清晰 丰富的标签(tag [视图层]) 通过配置文件页面导航,便于后期维护 与Servlet API松耦合,便于测试 4、Struts2主要目录 apps :该文件夹下包含了基于Struts2的示例应用 docs:该文件夹下包含了Struts2的相关文档,包括Struts2的快速入门、Struts2的文档以及API文档等内容 lib :该文件夹下包含了Struts2框架的核心类库,以及Struts2的第三方插件类库 src :该文件夹下包含了Struts2框架的全部源代码 5、Struts2搭建所需jar包 commons-fileupload-1.3.1.jar:Struts文件的上传和下载 commons-io-2.2.jar:文件读取 commons-lang3-3.1.jar:为java.lang包提供扩展 freemarker-2.3.19.jar:FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具 ognl-3.0.6.jar:支持ognl表达式 javassist-3.11.0.GA.jar:分析、编辑和创建JAVA字节码的类库 struts2-core-2.3.16.3.jar:Struts2的核心包 xwork-core-2.3.16.3.jar:xwork的核心包 asm-*.jar 类似javassits log4j-1.2.17.jar 日志类库 type filter text---> MyEclipse配置快捷提示struts-2.3.30\src\core\src\main\resources\struts-2.3.dtd 到xml catalog uri (导入jar包--->创建Struts.xml文件--->配置web.xml--->创建action) <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <!-- name package 唯一标识 --> <!-- action class默认com.opensymphony.xwork2.ActionSupport --> <!-- 默认方法execute --> <package name="default" namespace="/" extends="struts-default"> <action name="hello" class="com.opensymphony.xwork2.ActionSupport" method="execute"> <!-- result 默认值 success --> <result name="success">path.jsp</result> </action> </package> </struts> struts2-core-2.3.16.3.jar——>org.apache.struts2——>default.properties <constant name="struts.devMode" value="true" />(开发者模型) <constant name="struts.i18n.encoding" value="utf-8"></constant>(字符编码) <constant name="struts.configuration.xml.reload" value="true"></constant>() 6、创建Action 普通的Java类,编写public String execute(){}方法 public class HelloAnction { String houseType; String resultPage; public String getHouseType() { return houseType; } public void setHouseType(String houseType) { this.houseType = houseType; } public String getResultPage() { return resultPage; } public void setResultPage(String resultPage) { this.resultPage = resultPage; } public String execute(){ if(resultPage.equals("1")){ resultPage="oneHouse.jsp"; }else{ resultPage="otherHouse.jsp"; } return "success"; } } 实现Action接口,重写execute()方法 public class HelloAnction2 implements Action { public String execute() throws Exception { return "success"; } } 继承ActionSupport类,重写execute()方法(推荐使用) public class HelloAnction3 extends ActionSupport { @Override public String execute() throws Exception { return "input_page"; } public String add() throws Exception { return "add_page"; } public String login()throws Exception { return "login"; } } 7、Struts2基于MVC的Web应用框架 将请求和展现分开 8、Action 控制业务逻辑 如果业务逻辑很复杂,可以把业务逻辑构建为业务类,在Action中调用业务类 返回结果字符串 方便的处理数据 比如:Action中以属性方式接收用户数据 (1)Action接收参数方式一 Action接收参数(属性方式) 控制业务逻辑 表单参数名称必须在Action中有对应的setter以及getter方法 (必须得到set、get方法,应为stru2是通过反射去赋值) 解决乱码 修改struts.xml,添加代码<constant name="struts.i18n.encoding" value="编码格式" /> 页面显示 <%@taglib uri="/struts-tags" prefix="s"%> <s:property value="属性名"/> 应用场景 接收的参数字段个数少的时候适合使用,比如对于搜索应用,接收用户输入的搜索条件 public class LoginAction extends ActionSupport { //必须得到set、get方法,应为stru2是通过反射去赋值 private String loginName; private String loginPwd; public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } public String getLoginPwd() { return loginPwd; } public void setLoginPwd(String loginPwd) { this.loginPwd = loginPwd; } @Override public String execute() throws Exception { System.out.println(loginName+":"+loginPwd); if("admin".equals(loginName)){ return SUCCESS; }else{ return "fail"; } } } (2)Action接收参数方式二 Action接收参 数(JavaBean方式):将模型数据从Action中分离了出来定义实体类,为实体添加属性以及setter和gettercom.pb.entity.User 为Action添加实体属性以及setter和getter User user 修改表单参数name为实体对象名.属性名 <input type="text" name="user.userName"/> 取值通过<s:property value=“对象名.属性名”/>的形式 <s:property value="user.userName"/> public class JavaBeanAction extends ActionSupport{ private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { if(user==null){ return "login"; } if(user.getLoginName().equals("admin")){ return "admin"; }else if(user.getLoginName().equals("common")){ return "common"; }else{ return "login"; } } } (3)Action接收参数方式三 ModelDriver方式,Action实现ModelDriven接口,重写方法getModel();Action中要提供JavaBean类型的属性,需要实例化,但不需要相应的setter和getter方法 public class ModelDrivenAction extends ActionSupport implements ModelDriven<User> { private User user=new User(); public User getModel() { return user; } @Override public String execute() throws Exception { if(user==null){ return "login"; } if(user.getLoginName().equals("admin")){ return "admin"; }else if(user.getLoginName().equals("common")){ return "common"; }else{ return "login"; } } } 符:使用动态方法调用(需要把 struts.enable.DynamicMethodInvocation 设为true) <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.configuration.xml.reload" value="true"> </constant>(tomcat不需要重启) 9、使用method属性 访问Action时,默认调用的是execute()方法 可以在Action中定义多个业务方法 方法签名要与execute( )方法相同 public class HouseAction extends ActionSupport { public String add() { return "success"; } public String update() { return "success"; } 配置多个<action>标签 method属性指定调用的方法 <action name="house_add" class="com.pb.web.action.HouseAction" method="add"> <action name="house_update" class="com.pb.web.action.HouseAction" method=“update"> 10、动态方法调用 DMI(dynamic method invocation) 一个Action类中可以有多个业务方法 public class HouseAction extends ActionSupport { public String add() { return "success"; } public String update() { return "success"; } } 只需要配置一个<action>标签 不需要使用method属性 <action name="house"class="com.pb.web.action.HouseAction"> 调用时指出Action名和业务方法 http://localhost:8080/struts2/house!add <result>的name属性 public String add() throws Exception { return "addSuccess"; } public String update() throws Exception { return "updateSuccess"; } <action name="house" class="com.pb.web.action.HouseAction" > <result name="addSuccess">/houseAddSuccess.jsp</result> <result name="updateSuccess">/houseUpdateSuccess.jsp</result> </action>