struts2基础详解

 

目录

最新版本

struts2的目录结构

依赖包

struts2配置文件

配置的基本内容

合并配置文件

核心过滤器配置

在web.xml里

xml的常用配置

struts2配置文件执行的顺序

action的配置

result重新和转发配置

常量的配置

action的编写方式

国际化方式

配置指定方法

使用通配符对action优化

动态访问action

Struts2获取前台数据

完全解耦的方式

ActionContext

使用原生方式

接口注入方式

servlet和action的区别

数据封装

属性驱动

属性驱动的第二种方式

模型驱动

这个最常见的方式,也是推荐的方式

页面模式和模型驱动的使用场景

input逻辑视图配置(ssh应用的时候会讲解用处)

input表单异常

struts2复杂数据类型的封装

封装到list中

封装到map中,并采用属性驱动的第二种方式

OGNL 表达式

OGNL在java中的使用

root数据

context数据

在jsp页面使用ongl标签

需要开启静态方法访问

错误信息

值栈valuestack

值栈的内部结构

值栈和ActionContext的关系

获取值栈

操作ValueStack

调试页面

在action提供属性的get方法(不常用)

利用ognl取值

直接使用valueStack压入数值(这种方式比较常用)

使用ongl取值

值栈中保存集合

获取集合数据

操纵context中数据

ongl页面取值

EL表达式获取值栈的数据

OGNL中的遍历

构建的list集合

构建map集合

直接name取值(好用)

在实体类里提供get方法

struts2的标签库

单选框的input

map方式

textfield 

遍历1-10

运算遍历,这个和jstl相似

UI标签库

OGNL的符号

%符号

$符号

Struts2的拦截器

自定义拦截器 

自定义拦截栈

拦截方法

struts2的注解开发


最新版本

在struts2.5以上的版本,这里要写method方法需要首先配置,为了安全性,其实就是扯淡

如果想直接取消限制

https://blog.csdn.net/qq_34023135/article/details/78154700

jar包的改变

xwork包已经没了,整合到struts2-core里了

配置文件的改变

在filter的前面没有.ng了

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

补充内容(看完本篇再看补充)

struts2的过滤器,一般还会加上dispatcher

一般在package里添加一个这样的action,用于页面的转发跳转,而上面的forward就是对应下面的

因为我们的主要页面都是放在WEB-INF下的,是受保护的,并不能直接xxx.jsp就访问了

必须要通过服务器内部的转发,所以我们web.xml里才会加上dispatcher

前言

本篇讲解struts2基础知识,不会涉及到struts2的应用,应用在另一篇里

struts2概念和知识点总结 https://www.cnblogs.com/konrad/p/6426790.html

总的来说,struts2相当于一个servlet的角色,用于处理请求

本文的struts使用的是2.5版本,所以有些特性变掉了 https://blog.csdn.net/Longhaicn/article/details/79128141

struts2的目录结构

依赖包

这个比较麻烦,后面一般会通过maven来添加

这里使用的是struts2.5,如果是之前的版本,导jar包的时候,需要导入xwork

https://blog.csdn.net/Longhaicn/article/details/79128141

struts2配置文件

在上面解压的例子里,拿到xml配置文件,把约束复制过来

配置的基本内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!-- name可以随便写,这是包名,不重复即可,extends是继承的是以上,为继承某些配置,以后会详解 -->
	<!-- namespace是配合action的name,namespace和action的name共同组成访问路径 -->
	<package name="demo1" extends="struts-default" namespace="/">
	
		<!-- 配置action,name是我们需要在请求路径上写的,class是我们要访问的类 
		name就相当于servlet的url-parten,class就是相当于servlet-class -->
		<action name="hello" class="com.test.HelloAction">
		
<!-- 		success相当于是方法的返回值,如果name与返回值对应,就会跳到我们指定的页面 -->
		<result name="success">/success.jsp</result>
		
		</action>
	</package>
</struts>

目前必须把配置文件放到src目录下,不然访问不到

合并配置文件

一般这个称为主配置文件,用来配置一些常量,把对应的struts2.xml导入进来即可

需要合并的那个文件,也需要写上struts标签,但是里面的内容写packge即可

HelloAction对应的内容

有点像我们之前写的通用servlet内容https://blog.csdn.net/yzj17025693/article/details/88554048

方法的书写规则

1 返回值必须是String

2 方法不能参数

不过这个execute方法有点特殊,类似servlet里的service,只要访问这个helloAction就会访问execute

测试页面,写上hello,这个hello是我们在struts.xml里配置的,后面的.action目前是固定的

但是启动服务器后访问,依然报错,这是因为还有一个没有配置,那就是核心过滤器

核心过滤器配置

核心过滤器用来把所有的请求拦截并过滤,只有拦截了,才能跳到struts2框架的配置文件按照

struts2的规则来执行

按ctrl+shift+t 打开类型,然后复制路径

在web.xml里

在struts2.5里是这样,之前的版本,在filter前面还有一个.ng

https://blog.csdn.net/Longhaicn/article/details/79128141

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


 

xml的常用配置

struts2配置文件执行的顺序

这个可以在源码里看,具体百度,这里不做讲解

我们可以看到struts-default是第二个就执行了,这个在struts.xml配置文件里的package的extends里会被继承

而web.xml是加载的比较晚的,最后才加载bean对象

标红的是我们需要注重配置的

需要注意的就是 后配置的常量会覆盖之前配置的常量的值(后面会讲)

package的配置

action的配置

我们上面没有指定method,是因为我们写的是execut,默认是执行这个方法

如果是其他方法名,需要指定指定method

result重新和转发配置

上面都是配置的局部结果页面

全局结果页面

配置在package里

配置使用转发和重定向

我们从上面可知,result用来配置跳转页面的,但是跳转有2种模式

struts默认使用的是转发

可以加上type属性进行更改

常量的配置

常量都是在这个配置文件里定义的,我们只需要一些常用的即可

一般是编码和后缀

在struts.xml修改

在web.xml里修改,通过初始化参数

action的编写方式

实现action

国际化方式

下面都是用国际化方式作为讲解,不过实际开发中不会这种做,具体可看ssh整合部分

配置指定方法

我们之前使用的是默认的excute方法,而现在需要配置指定的方法

一个方法对应一个action

使用通配符对action优化

向上面那样做,每个方法写一个action,效率太低,可以用通配符进行优化

在action里

后面的1表示,取出前面的通配符中第一个*的取值,这样只需要写一个action

动态访问action

与通配符相对于的是动态访问,但是其实还没有通配符智能

动态访问,也就是在请求路径上  name的后面加一个!(感叹号)然后再加上方法名

Struts2获取前台数据

在实际开发中,经常使用到servlet的api,比如进行登录,将用户的信息保存到sessi中

用到response对象,设计到servlet的api访问.会有耦合性

完全解耦的方式

ActionContext

利用struts2的ActionContext对象来获取参数

同理,也可以利用ActionContext放入参数

contex的作用域相当于request

完全解耦注意事项

使用完全解耦的方式只能获取map数据和设置map数据,并不能使用request,sessino,app本身的方法,比如获取请求头之类

使用原生方式

使用原生方式获取,request可以从ServletActionContext获取到

接口注入方式

需要实现ServletRequestAware接口

并且手动写上面HttpServletRequest对象,实现setServletRequest方法把request注入进来

通用能使用request对象

servlet和action的区别

数据封装

属性驱动

属性驱动会自动调用set方法,把数据传入我们定义的属性里,所以传过来的参数的名称要和这个属性名一样

但是接收的时候,肯定还是需要我们自己创建bean对象,然后把数据封装进去

属性驱动一般只有比如传了一个id,或者传了一个文件名这种单一的情况下才会使用属性驱动的set方法

因为所有属性都写在action,影响阅读性

属性驱动的第二种方式

方式2关键是在页面上要提供具体的类

这样不用在action里写属性

但是需要在action里创建对象, 并且提供get方法

下面是把数据封装到user对象里

模型驱动

这个最常见的方式,也是推荐的方式

需要action实现ModelDriven接口

并且手动创建Bean对象

再利用实现的方法把对象返回,这个返回的对象里面已经有数据了,我们只需要使用user即可

页面模式和模型驱动的使用场景

input逻辑视图配置(ssh应用的时候会讲解用处)

逻辑视图通俗一点就是方法的返回值有5个常量

而有点特殊,是页面使用input标签

input表单异常

这个是为了方便而设立的,如果我们的表单异常,能直接拦截到

在jsp里页面显示错误信息,用struts2的标签库(后面会讲)

struts2复杂数据类型的封装

模型驱动和上面一样,下面主要是属性驱动方式

测试的bean类

封装到list中

现在采用属性驱动的页面方式,get方法也需要提供

封装到map中,并采用属性驱动的第二种方式

ame后面都是ongl表达式(后面会讲)

OGNL 表达式

ongl表达式可以在很多地方使用,而el表达式只能在jsp里

OGNL在java中的使用

双引号里是表达式, 单引号里是字符串  .length是字符串的方法

需要传递context和root

ognl表达式访问静态方法,需要在前面加上@

root数据

访问root中的数据,不用加#,直接getValue

context数据

但是访问context里的数据,需要用#包围

在jsp页面使用ongl标签

在jsp页面下默认不允许使用静态成员

需要开启静态方法访问

错误信息

值栈valuestack

valuestack的生命周期和request访问servlet的周期一样

而request的数据只能在jsp里使用(需要转发),而值栈里的数据可以在jsp页面,配置文件等其他地方使用

值栈的内部结构

下面是获取值栈,然后下断点查看valuestack

图解

CompounRoot继承了ArrayList

而OnglContext实现的是map

root里一般用来放objet,而context什么都可以放

我们操作值栈,说的是操作root区域的数据

值栈和ActionContext的关系

获取值栈

同一个action里的valueStack是一样的

可以通过ActionContext和ServletActionCotext获得

上面的第二种方法,也可以这样获得,不过一般用第一种方式

操作ValueStack

调试页面

在跳转到了succes.jsp页面写上<s:debug></s:debug>

高版本的struts2还需要在配置文件里配置一下

如果不用debug 的时候

跳转过去的时候会显示

在action提供属性的get方法(不常用)

因为整个action都在值栈里,所以action的属性User也会在值栈里

利用ognl取值

直接使用valueStack压入数值(这种方式比较常用)

使用ongl取值

使用push直接就是把对象里的属性放在栈顶,直接<s:property:value=usernmae/>属即可

在调试页面,我们可以看到我们上面用push存的属性,但是用set存的却看不到

这是因为我们在action里没有提供get方法,所以页面显示不了内容,但是我们却可以取到值栈里的内容,因为他只是调试页面不显示而已

直接获取即可

值栈中保存集合

获取集合数据

操纵context中数据

上面我们都是操作的是root区域,默认valueStack是把对象存在root中

下面是操作context的数据,和之前操作servlet的request、session很像

但是servlet还有一个application,这里用是servletContext

其实servletContext就是application,他们是声明周期是一样的

两者的唯一区别就是application用在jsp中,servletContext用在servlet中


 

ongl页面取值

记得需要在作用域前加上#

下面第4个attr默认是request,如果request里没有数据,那么attr就是session,是一个智能的默认值

parameter.id是用来接受参数的

我们访问action的时候,action转发到这个页面,因为是转发,所以链接是不变的,所以有些参数比如id可以传递到这里

EL表达式获取值栈的数据

直接使用  ${usernmae}或者${requestContex.name}即可   因为,struts底层是对request进行了增强的封装

所以默认在值栈中的数据,在作用域里也有

OGNL中的遍历

构建的list集合

var是每次遍历后的存放的数值

这样构建的list默认在context和root区域都有,所以不需要#也能获取到

构建map集合

和list一样,也一样在contxt和root里也会有,但是构建map,需要在前面加一个#

i是获取key和value,可以直接获取到

但是单单的获取key或单单的获取value,必须要使用#

直接name取值(好用)

因为action整个会放到值栈里,所以其实我们是可以直接取的

并且第二种会直接回显数值

第二种更方便的是,只要使用了的是OGNL表达式,也就是说表单使用OGNL表达式,比如<s:Input name"xx"

只要写了name,那既可以提交,又可以直接回显数据

在实体类里提供get方法

在实体类里提供get方法,当使用json把对应的objcet或者list或map数据转成json数据的时候

所有get方法都会被自动转成字段,所以我们直接在页面取值的时候

可以用easyUI的data-options获取到,因为这是处理json的,其它处理json的插件也可以

但不能用struts2的标签获取,因为并没有把数据放入某个区域,只是传递json而已

struts2的标签库

建议看这里 https://blog.csdn.net/q547550831/article/details/53326042

单选框的input

label 是放在前面的文字

需要注意下面2种方式略有不同,value的数值是不同的

list方式

map方式

textfield 

相当于Input type="text" 

遍历1-10

运算遍历,这个和jstl相似

status是计数器对象

UI标签库

OGNL的符号

%符号

value后面的字符串如果不加%{} 不会解析成OGNL,所以要加%

$符号

Struts2的拦截器

自定义拦截器 

这里写2个拦截器,方便查看拦截器的执行顺序

后面执行的时候,会产生这样的相当于,进入了拦截器后随后又进入了另一个拦截器

还需要在struts.xml的packag里定义拦截器

定义完后还需要在action里面引入拦截器

defaultStack是默认拦截器,必须引入

自定义拦截栈

然后再把整个拦截栈当住拦截器引入

需要注意的是,在action里引入就是拦截action,在package里引入就是拦截全部

拦截方法

methodFilterInterceptor更加的强大

需要我们的拦截器继承methodFilterInterceptor并实现doIntercept方法

配置的时候,加上<param/>  name是excludeMethods 就是排除方法,排除login和regist方法,这2个方法不拦截

struts2的注解开发

先看这个,最好有spring注解的基础 https://www.cnblogs.com/qq739178184/p/5109778.html

再看这个https://blog.csdn.net/csdn_huzeliang/article/details/79057004

猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/88624294