【Java】Struts2笔记I

目录

 

1.Struts2执行过程

2.核心配置文件struts.xml标签以及属性

constant 

package 

action

result

3.action方法访问的三种方式

3.1 用action标签的method属性值指定方法

3.2 通配符方式实现

3.3 动态访问实现(不用)

4.结果页面配置

4.1全局结果页面配置

4.2局部结果页面

5.获取表单提交数据

5.1原始方式request

5.2 Struts封装方法

6.值栈

6.0如何得到值栈

6.1什么是值栈

6.2值栈的内部结构

6.3三种方式向值栈中存取数据

6.3.1 set方法

6.3.2 push方法

6.3.3 在action中定义变量,生成变量的get方法(常用)

6.4 从值栈中取list集合

6.5 用OGNL操作值栈

7.拦截器(interceptor)

8.Struts2的标签库


1.Struts2执行过程

2.核心配置文件struts.xml标签以及属性

 

<struts>
	<package name="hellodemo" extends="struts-defalut" namespace="/">
		<action name="hello" class="com.action.Action">
			<result name="ok">/hell.jsp</result>
		</action>
	</package>
</struts>

constant 

用于修改常量

name:struts.i18n.encoding

value:UTF-8

还有两种方式(了解)

- 在src下面创建 struts.properties,进行修改

- 在web.xml进行配置

 

package 

package里面才能配置action

name:只是为了区分不同package,和功能本身没有关系

extends:属性值固定->struts-defalut,写了这个属性之后package才具有action功能

namespace:要和action标签里面的name属性值构成访问路径   比如 /(namespace) + hello(action)  不过默认为/

action

配置action的访问路径,指定通过什么路径来访问哪个类 

可以有多个action但是name不能相同

name:和namespace构成访问路径

class:要访问的那个类的全路径

method:action默认执行execute方法,但可以用method来让action的多个方法执行

 

result

根据调用action的class指定的类的方法返回值 配置到不同的路径(页面)中去

name:同方法的返回值

type:配置如何到路径(转发or重定向)

           默认为转发(dispatcher),重定向(redirect)

           -chain:转发到action,一般不用,有缓存问题

          -redirectAction:重定向到action

 

 

 

3.action方法访问的三种方式


 

3.1 用action标签的method属性值指定方法

没有指定method的话 则执行execute()方法

3.2 通配符方式实现

{1}代表第一个*   比如访问book_add.action,此时{1}就代表add

可以有多个*

3.3 动态访问实现(不用)

4.结果页面配置


4.1全局结果页面配置

如果多个action,返回值是相同的,指向的页面也是相同的(多行相同的<result></result>)

在<package>标签里面配置

<global-results>
	<result name="success">/hello.jsp</result>
</global-results>

配置完之后就不用写result了 对当前package内所有action(全局)生效

4.2局部结果页面

就是一般地用<result>标签(一个action对应一个result)

5.获取表单提交数据


 

5.1原始方式request

5.1.1ActionContext类

ActionContext context = ActionContext.getContext();
Map<String, Object> map = context.getParameters();

5.1.2ServletActionContext类

HttpServletRequest request = ServletActionContext.getRequst();
String username = request.getParameter("username");

5.1.3接口注入(一般不用)

让action实现接口-->为了得到request对象

ServletRequestAware接口

5.2 Struts封装方法

5.2.1属性封装(继承ActionSupport)

步骤:

1)将表单会提交的数据,定义在action里面

     -变量名称和表单输入项的name属性值一样

2)生成变量的set方法(get/set)

原理:内省

缺点:不能把数据直接封装到实体类的对象

5.2.2模型驱动封装(重点)

步骤:

1)action实现接口ModelDriven

2)实现接口方法getModel   -将创建对象返回 (也需要变量名称和表单输入项的name一样)

3)在action里面创建实体类对象

5.2.3表达式封装

步骤:

1)声明实体类(User)

2)生成实体类变量的set和get方法

3)表单输入项的name属性值用表达式形式(eg: name="user.username")

6.值栈


6.0如何得到值栈

actionContext.getValueStack()

6.1什么是值栈

值栈:Struts2里面自己的存储机制(类似于web中的request域)

每次访问action都会创建action对象,每个action对象都会有且只有一个值栈对象

 

6.2值栈的内部结构

主要的两部分:rootcontext

6.2.1 root (list集合)

操作的是root里面的数据

6.2.2 context (map集合)

value中存储的是对象的引用

 

6.3三种方式向值栈中存取数据

 

6.3.1 set方法

stack.set("username", "hello");

少:在jsp中用<s:property value="username"/>可以获取"hello"

 

6.3.2 push方法

stack.push("hello");

少:<s:property value="[0].top"/> 取到栈顶的值
 

6.3.3 在action中定义变量,生成变量的get方法(常用)

eg:①定义一个变量name,设置对应的②get方法,在action中③赋值name="abcdefgh";

优点:直接在action中存储数据,不会造成存储空间的浪费

 

6.4 从值栈中取list集合

6.4.1

6.4.2 遍历list集合

6.4.3 遍历list集合

注意:遍历list出来的user对象是放到context里面的!!

EL表达式也可以取到值栈数据

原因:

底层增强request对象里面的方法getAttribute方法

1)先从request域获取值,如果获取到就直接返回

2)如果获取不到值,就从值栈中把值获取再存到域对象里面

 

6.5 用OGNL操作值栈

作用:和Struts标签一起使用来操作值栈

6.5.1 #的使用

6.5.2 %的使用

在struts2标签里面使用ognl表达式,如果直接在struts2表单标签里面使用ognl表达式不识别,只有%之后才会识别。

7.拦截器(interceptor)


*位置

struts2-core-xxxx.jar内的struts-default.xml中

*执行时间

action对象创建之后,action方法执行之前

*底层原理

1)aop思想

不修改源代码(不是通过调用拦截器的方法)

而是通过配置文件,来建立和拦截器的关系

2)责任链模式

java中的设计模式之一,和过滤链相似

过滤链:一个请求有可以有多个过滤器进行过滤,而只有过滤器进行放行之后才能进行下一个过滤器

责任链中就是进行 不是过滤的操作 但之后要放行 才能向下运行

*执行原理

主刀医生  --  递工具的护士

默认的过滤器 -- 过滤器中的过滤器(一个一个按顺序执行)

*和过滤器区别

1)过滤器:过滤器理论上可以过滤任何内容,html、jsp、servlet、图片路径

2)拦截器:拦截器只可以拦截action

*Servlet和action区别

1)Servlet默认第一次访问的时候创建,创建一次,单实例对象

2)action每次访问时创建,创建多次,多实例对象

*自定义拦截器功能

1)创建类,继承MethodFilterInterceptor类(好处:可以让某个方法不进行拦截)

2)重写里面的方法,拦截器的逻辑,(放行 return invocation.invoke()

3)配置action和拦截器的关系(注册拦截器)

>>>在拦截的action的package声明拦截器<interceptors>...</interceptors>

>>>在具体的action里面使用拦截器  <interceptor-ref name=""></interceptor-ref>

>>>配置了自定义拦截器之后,默认的拦截器就不会执行了,所以要再手动使用默认拦截器<interceptor-stack name="defaultStack"></interceptor-stack>

4)配置不需要拦截的方法:在interceptor-ref标签中<param name="excludeMethods">方法名</param>

8.Struts2的标签库

常用标签

s:property:和ognl表达式在jsp页面获取值栈数据

s:iterator:获取值栈list集合数据,表示list集合

s:debug:查看值栈结构和数据

猜你喜欢

转载自blog.csdn.net/TypantK/article/details/83040095