Struts2使用步骤及值得传递

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

%的的用途是将字符串当成OGNL表达式解析。
$符号主要有两个用途:
用于在国际化配置文件中应用OGNL表达式
用于在struts配置文件引用OGNL表达式

猜你喜欢

转载自blog.csdn.net/huang_yx/article/details/79782833
今日推荐