struts2知识点总结

这是本人写的第一篇博客,写这篇博客一来是为了总结Struts2的知识点,二来是为了自己在后面码代码的时候能够查阅。当然我水平有限,写的不好还请大神指点。(本文中有多处内容是截图,那是我在学习过程中做的doc文件笔记中的内容)

学习Struts2必然少不了下载jar包的过程下面附上下载地址。

Struts2 jar 包下载地址:http://struts.apache.org/download.cgi


Struts2简介(此处内容为百度文库内容):

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,
在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,
这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

Struts2的使用:

1、首先我们需要将jar包导入工程lib目录下
2、然后在web.xml配置Struts2的filter代码如下
<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>/*</url-pattern>
</filter-mapping>
3、然后创建struts.xml文件(注意此文件需要放在classpath路径下也就是项目src文件夹下)下面附上struts.xml的模板代码
下面附上struts配置文件详解地址:

http://www.cnblogs.com/wkrbky/p/5889328.html


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>

    <!-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 -->
    <include file="struts-default.xml"></include>
    
    
    <!-- package提供了将多个Action组织为一个模块的方式
        package的名字必须是唯一的 package可以扩展 当一个package扩展自
        另一个package时该package会在本身配置的基础上加入扩展的package
        的配置 父package必须在子package前配置 
        name:package名称
        extends:继承的父package名称
        abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false
        namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action
     -->
    <package name="com.kay.struts2" extends="struts-default" namespace="/test">
        <!-- Action配置 一个Action可以被多次映射(只要action配置中的name不同)
             name:action名称
             class: 对应的类的路径
             method: 调用Action中的方法名
        -->
        <action name="hello" class="com.kay.struts2.Action.LoginAction">    
            <!-- 节点配置
                name : result名称 和Action中返回的值相同
                type : result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher
             -->
         <result name="success" type="dispatcher">/talk.jsp</result>
        </action>
    </package>
</struts>

Struts2引用多个配置文件:

当我们在实际开发中需要避免不了使用多个action,那么我们的struts.xml文件就需要配置多个action,这样一来配置文件就会显得非常臃肿,
不仅不利于维护,还会让别人感觉自己很外行,所以我们这个时候就需要将各个进行不同功能的配置文件单独写出来,然后进行引用,这样就会非常
方便利于项目的维护。 下面附上模板
1)、这就是一个很臃肿的例子
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
 
<package name="default" namespace="/" extends="struts-default">
</package>

<package name="audit" namespace="/audit" extends="struts-default">
	<action name="WelcomeAudit">
		<result>pages/welcome_audit.jsp</result>
	</action>
</package>

<package name="user" namespace="/user" extends="struts-default">
	<action name="WelcomeUser">
		<result>pages/welcome_user.jsp</result>
	</action>
</package>

</struts> 
2)、下面我们看看怎样将它分离开来
①.取名字叫做audit-struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>

<package name="audit" namespace="/audit" extends="struts-default">
	<action name="WelcomeAudit">
		<result>pages/welcome_audit.jsp</result>
	</action>
</package>

</struts>




②.取名字叫做user-struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
 
<package name="user" namespace="/user" extends="struts-default">
	<action name="WelcomeUser">
		<result>pages/welcome_user.jsp</result>
	</action>
</package>

</struts>




怎样引入呢?
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
 
<package name="default" namespace="/" extends="struts-default">
</package>

<include file="conf/user-struts.xml"></include>
<include file="conf/audit-struts.xml"></include>

</struts>



项目结构如下图



下面我们研究一下struts的多方法调用:


public class Demo01Action extends ActionSupport{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public String execute(){
		System.out.println("execute...");
		return null;
	}
	public String save(){
		System.out.println("save...");
		return null;
	}
	public String delete(){
		System.out.println("delete...");
		return null;
		
	}
}


Struts2中的action如果有多个方法,无需配置多个<action>标签;

首先我们可以使用动态的调用(不推荐),只需要在访问的action名字后面加上!"methodName"即可。但是struts2认为动态调用是不安全的,所以默认是禁止的。

http://localhost/method/demo01!save(类似于这样的fang)



下面我们可以看一下推荐的例子:

“*”通配符方式 “*”代表任意字符

Struts2允许我们在配置一个<action>name的时候使用”*”;

并且我们可以在当前的<action>标签中使用这个”*”所代表的值;

第一个“*可以使用 {1}如下代码所示:

        <action name="demo01_*" class="" method="{1}">
        	<result name="" type=""></result>
        </action>




Struts2参数接收:

1).使用action属性接收:
	<form action="(此处为action的地址)">
		用户名:<input type="text" name="name"><br/>
		密码:<input type="password" name="password"><br/>
		<input type="submit" value="登录">
	</form>
private String name;
	private int password;
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}

	public int getPassword() {
		return password;
	}

	public void setPassword(int password) {
		this.password = password;
	}



2). 使用DomainModel接收参数:
	private User user ;//先创建一个User实体有一个name属性和一个age属性然后再Action类中定义一个user对象
	
	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	<form action="(此处为action的地址)">
		用户名:<input type="text" name="user.name"><br/>
		密码:<input type="password" name="user.password"><br/>
		<input type="submit" value="登录">
	</form>
注意表单input的name....


3).使用ModelDriven接收参数:

public class Param01Actiion extends ActionSupport implements ModelDriven<User> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private User user = new User();
	
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}
	
}
	<form action="(此处为action的地址)">
		用户名:<input type="text" name="name"><br/>
		密码:<input type="password" name="password"><br/>
		<input type="submit" value="登录">
	</form>

下面我们来研究一下struts2的拦截器,以及如何自定义拦截器:

Struts2拦截器是在访问某个Action或执行某一个Action的方法之前或之后进行拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.(可以把拦截器理解为过滤器);

 

Struts2中几乎所有的功能实现都是在每一个拦截器中完成;比如struts2的文件上传,参数接收这些功能都是写每一个拦截器中;

 

拦截器栈(Interceptor Stack:Struts2拦截器栈就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

 

拦截器栈拦截器1+拦截器2+拦截器3

执行顺序:拦截器1 - > 拦截器2 -> 拦截器3 -> Action;


(以下内容可能在面试的时候被面试官问)

①.客户端发送请求;

②.该请求会被核心控制器拦截器(就是本文最开始讲到的在web.xml中配置的filter)

③.StrutsPrepareAndExecuteFilter这个核心控制器会根据我们请求的URI地址在配置文件查找是否有对应ActionMapper(Action配置)。

④.如果ActionMapper决定需要调用某个Action,StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy(Action代理,代理是包含Action本身)。

⑤.ActionProxy通过配置文件创建对应Action对象。

⑥.ActionProxy创建一个ActionInvocation的实例,即Action执行流程对象。

⑦.ActionInvocation实例调用Action的前后涉及到相关拦截器(Intercepter)。

⑧.拦截器执行完毕后就执行Action,会根据返回视图名在配置文件查找对应的返回结果,进行页面返回。


<default-interceptor-refname="defaultStack"/>



struts2使用拦截器:

第一种:<package>中配置一个默认拦截器:<default-interceptor-ref name="defaultStack"/>

如果<action>没有指明我们使用拦截器,那么就使用这个默认的拦截器拦截器;

 

第二种:<action>中配置使用的拦截器:

<action>

<interceptor-ref name="拦截器的名字1"/>

<interceptor-ref name="拦截器的名字2"/>

</action>

注意一旦在<action>中配置了拦截器,那么默认的拦截器就不生效了;

 

 第三种:定义拦截器栈



自定义拦截器



配置自己写的拦截器

1.使用我们编写拦截器

方式一:




方式二:


下面举一个自定义登录拦截器的例子



以上的配置会对所有的action进行拦截,这时我们可以在其它不需要被拦截的action中重新配置一个拦截器

Struts2 OGNL表达式

OGNL表达式语言介绍

OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,

它是一个开源项目。Struts2框架使用OGNL作为默认的表达式语言。

 

OGNL表达式与EL表达式

表达式其实就是通过特殊符号或字母去某个区域获取我们想要的数据;

 

El表达式通过${El表达式}到四个作用域(page,request,session,application)中获取数据

Servlet只需要把数据放到四个作用域,页面就可以通过EL表达式获取数据;

 

 

OGNL表达式通过struts2标签属性值指定表达式,表达式的取值范围为ValueStack对象(值栈);

Action只需要把数据放到值栈,页面就可以通过OGNL表达式获取数据;

 

 

OGNL表达式写在哪

OGNL只能在struts2的自定义标签中使用

<%@ taglib uri="/struts-tags"prefix="s" %>

<s:property value="OGNL表达式" />

 

OGNL ValueStack(值栈对象)

ValueStack对象是用于struts2传输数据的对象,页面提交参数、后台的数据都是依靠这个对象来传递(页面参数传递到后台、 后台数据传递页面);

 

 每一个Action请求都有一个ActionContextAction上下文对象),ActionContext中都有一个ValueStack对象;

ActionContext.getContext().getValueStack();

 

Struts2为了让开发者搞清楚valuestack的内部结构,便于我们正确的取值,为我们提供了一个调试标签<s:debug/>

<s:debug/>



OGNL 访问规则

OGNL表达式如果没有“#”前缀那么代表的访问的是 Root根对象中数据,如果有“#”那么访问的OGNL上下文对象中数据;

 

<s:propertyvalue=”name” />查找值得过程,从根对象的栈顶开始由上之下搜索,一旦搜索到就返回,不会继续向下查找;

 

 

 

访问技巧:

如果访问的数据是根对象中数据,那么直接写根对象中“属性名即可”,如果访问的数据是上下文对象中数据,那么必须写”#key”



OGNL 访问规则

OGNL表达式如果没有“#”前缀那么代表的访问的是 Root根对象中数据,如果有“#”那么访问的OGNL上下文对象中数据;

 

<s:propertyvalue=”name” />查找值得过程,从根对象的栈顶开始由上之下搜索,一旦搜索到就返回,不会继续向下查找;

 

 

 

访问技巧:

如果访问的数据是根对象中数据,那么直接写根对象中“属性名即可”,如果访问的数据是上下文对象中数据,那么必须写”#key”




OGNL特殊指令


两种方式如何选择:

如果是表单相关的数据都放到Root根对象;

其他数据都放到上下文对象;

Struts2 通过EL表达式获取ValueStack中的值

因为request被struts2包装过org.apache.struts2.dispatcher.StrutsRequestWrapper

 

 

使用EL表达式,它会调用request.getAttribute(key);,首先会通过原始凡是查找request中是否存在这个属性,如果存在直接返回,如果不存在,它会把key当成一个OGNL表达式拿到ValueStack(值栈)中查找;

 

Struts2还有许多常用标签:

用标签的时候必须引入标签
<%@ taglib uri="/struts-tags" prefix="s" %>
如果想要详细了解标签可以到下面地址查询





  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值