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中几个符号的含义: