Struts2发展史
Struts1是Apache软件基金会(ASF)赞助的一个开源项目。它通过javaServlet、jsp技术,实现基于javaEEWeb应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品;Struts1结构简单小巧,十分易用,一度市场占有率超过20%,但是由于与JSP/Servlet耦合太紧密了,以至于被后来的框架陆续赶超。
WebWork是有OpenSymphony组织开发的,是简历在称为Xwork的Command模式框架智商的强大MVC框架,晚于Struts1,但是技术上更为先进。
Struts2是Struts的下一代产品,是在Struts和WebWork的技术基础上进行了合并的全新MVC框架。
Struts2与Struts1差别巨大,Struts2以Xword为核心,可以理解为是WebWork的升级版。
Struts2使用步骤
1.流程设计
2.搭建环境
3.配置前端控制器
Struts2使用filter来充当前端控制器,因此在web.xml配置一个filter即可(跟Servlet类似);
Struts2预置了该filter的实现类,名为:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
如下:
<!-- filter 会自动找包(package)中的struts.xml(固定的名称,不能乱写) --> <filter> <filter-name>mvc</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>mvc</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>
4.编写业务控制器Action
创建业务控制器组件,通常命名为XXXAction,该组件是一个满足JavaBean规范的类。
在Action中定义业务方法,要满足下列条件:
- 方式是public的
- 返回值是String类型
- 参数列表为空
编写业务方法
- 方法内编写业务逻辑代码
- 返回的字符串与struts.xml -> action -> result的那么属性匹配,即根据此返回值可以找到对应的result
@Controller public class DemoAction { public String execute(){ System.out.println("Demo"); return "error"; } }
<action name="demo" class="demoAction"> <result name="error" type="redirectAction"> /WEB-INF/error.jsp </result> </action>
5.配置Action和Result
在struts.xml中配置请求与Action的关系;
在action下,通过result设置转发的页面
<struts> <!-- package:包,用于对Action进行封装。 1.name:包名;根元素下可以有多个包,彼此之间不能重名 2.extends:继承;用于指定继承的包,相当于将继承包下的配置信息复制到当前包下 3.namespace:命名空间,用于规定Action的访问路径,必须以“/”开头 --> <package name="test" namespace="/test" extends="struts-default"> <!-- action:业务控制器,用于注册业务控制器组件(类) 1.name:action名称,用于规定Action的访问路径, 一个包下可以有多个Action,彼此之间不能重名。 2.class:业务控制器,用于指定业务控制器对应的类 3.method:方法,用于指定访问当前action时要调用的方法 *4.请求URL:http://IP:端口/ProjectName/NAMESPACE/ACTIONNAME.action --> <action name="hello" class="test.action.HelloAction" method="execute"> <result name="success"> hello.jsp </result> </action> </package> </struts>
6.编写JSP页面
Struts2参数传递
页面向Action传值
(1)基本属性注入
在Action中定义基本属性,并提供set方法
/** * 接受注入的基本属性值 * 1.Struts2会自动实例化该属性 * 2.Struts2会自动调用set方法为该属性设置值 * 3.上述行为发生在Action实例化之后,业务方法调用之前 */ private String name; public void setName(String name) { System.out.println("基本值属性```"); this.name = name; }
在表单文本框指定表达式“属性名”
<!-- 演示基本属性注入 1.name中的表达式直接写为Action的属性名即可。 2.Struts2会自动根据名称调用Action中对应的set方法为属性赋值 --> 姓名:<input type="text" name="name"/>
(2)域模型注入
在Action中定义实体对象属性,并提供set、get方法
public class User { private String userNamr; private String password; public String getUserNamr() { return userNamr; } public void setUserNamr(String userNamr) { this.userNamr = userNamr; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
/** * 接受注入的域模型对象 * 1.Struts2会自动嗲用set方法为该对象设置值 * 2.Struts2会自动嗲用set方法为该对象设置值 * 3.上述行为发生在Action实例化之后,业务方法调用之前 */ private User user; public void setUser(User user) { System.out.println("注入域模型对象···"); this.user = user; }
表单中文本框指定表达式“对象名.属性名”
<!-- 演示模型域注入 1.name中的表达式要写“对象名.属性名”; 2.Struts2会自动调用对象属性的set方法为其赋值。 --> 用户名:<input type="text" name="user.name"/> 密码:<input type="password" name="user.password">
Action向页面传值
(1)使用EL表达式显示Action的值
取基本属性值:${属性名}
取域模型对象值:${对象名.属性名}
<!--显示基本属性值--> <h1>姓名:${name}</h1> <!--显示域模型对象值--> <h1>用户名:${user.userName}</h1> <h1>密码:${user.password}</h1>
结论:取值EL表达式的写法,与注入时表达式的写法一直
(2)使用OGNL表达式显示Action的值
使用Struts2标签,需要先在页面中引入struts2标签库:标签库的位置在struts2-core-2.3.1.2.jar包中的META-INF/struts-tags.tld
<%@ taglib prefix="s" uri="/struts-tags" %>
如果要访问对象栈中的值,直接访问属性即可;
<s:propertory/>是一个输出标签;
<span style="white-space:pre"> </span>Person person = new Person(); person.setName("张三"); person.setAge(1); ActionContext.getContext().getValueStack().push(person);
获取方式:
<s:property value="name"/>如果访问Map栈中的值,需要加#
ServletActionContext.getRequest().setAttribute("as_request", "as_request");
<s:property value="#request.as_request"/>
OGNL表达式(Object-Graph Navigation Language):对象图像化导航语言
OGNL表达式有以下特点:
- 支持对象方法调用:objName.methodName();
- 支持类静态的方法调用和值访问
@[类全名(包括包路径)]
@[方法名|值名]
如:@java.lang.String@format('foo%s','bar')
@tutorial.MyConstant@APP_NAME;
- 支持赋值操作和表达式串联
- 操作集合对象
说明OGNL中几个符号的含义: