struts2总结
Struts
准备环境
1导入jar包
2在web.xml中配置前端控制器
3在src下建struts.xml,并配置
如下:
2在web.xml中配置前端控制器
<!-- 配置struts2的核心过滤器 -->
<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>
在src下建struts.xml,并配置
<struts>
<!-- 开启开发者模式 -->
<constant name="struts.devMode" value="true"></constant>
<!—访问-->
<package name="p1" extends="struts-default" >
<action name="hello"
class="com.lq.action.Hello" method="sayHello">
<result name="success" type="dispatcher">
/hello.jsp
</result>
</action>
</package>
</struts>
Struts.xml的常用标签:
constant标签
作用:
用于修改struts2中的常量
属性:
name:指定常量的key
value:指定常量的值
用法:
<!-- 开启开发者模式 -->
<constant name="struts.devMode" value="true"></constant>
package标签
作用:
在struts2的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。
属性:
name:
包的名称。必须写。且必须唯一。
extends:
一般情况下需要继承struts-default包,但不是必须的。不过如果不继承的话,将无法使用struts2提供的核心功能。struts-default.xml中定义着struts-default这个包。而struts-default.xml是在我们的struts.xml加载之前加载。
abstract:
把包声明为抽象包,抽象包就是用来被继承的。只要是没有<action>元素的包,就可以声明为抽象包。
namespace:
名称空间。它的作用是把访问的URL按照模块化来管理。
名称空间的写法:
必须以/开头
后面可以是字母和数组的组合,也可只有字母。
如果有数字的话,数字不能作为/后面的第一个字符。
当我们指定了名称空间之后,访问的URL就变成了:
名称空间+action标签的name属性取值
用法:
<package name="p1" extends="myDefault" namespace="/n1">
<action name="hello" class="com.itheima.web.action.HelloAction" method="sayHello">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
action标签
作用:
建立动作名称和动作类以及动作方法的对应关系。
属性:
name:指定的动作名称。和页面中url后面保持一种。注意此处不能后缀。动作名称必须唯一。
class:指定的是动作类的全限定类名。
method:指定的是动作方法名称
入门案例
Hello.java
public class Hello {
public String sayHello(){
System.out.println("HelloAction的sayHello方法执行了。。。。"+this);
//返回result中name=”success” 对应的hello.jsp页面
return "success";
}
}
执行过程:
Struts2的执行过程
执行时序:
首先是,启动tomcat服务器,这时候会加载web.xml,当读到filter标签时,会创建过滤器对象。
struts2的核心过滤器(StrutsPrepareAndExecuteFilter)会负责加载类路径下的struts.xml配置文件。
其次,从客户端发送请求过来 先经过前端控制器(核心过滤器StrutsPrepareAndExecuteFilter),前端控制器会根据请求的名称在struts.xml中找到对应的配置,创建我们的动作类对象(每次访问时都会创建新的Action对象),然后执行指定的方法,根据方法的返回值找到Result的配置进行页面的跳转.最后响应浏览器。
Action的创建方式
- 无侵(入门)
- 实现action接口
- 继承ActionSupport(常用)
调用Action中方法的方式
静态调用
<action method=”add”>
动态调用
访问路径使用感叹号user!addUser action中 不需要配置method
通配符
|
参数调用在url上拼接参数
1参数作为action对象的成员属性
Private String name;
http://localhost:8080/struts01/p1/param?username=zhangsan&age=20 |
2对象作为action对象的成员属性
Private User user;
http://localhost:8080/struts01/p1/parama?user.username=zhangsan&user.age=20 |
访问web元素 在url上拼接参数
将controller的结果响应给.jsp
- 实现接口implements RequestAware,SessionAware,ApplicationAware
public class UserAction1 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
private Map<String,Object> request;
private Map<String,Object> session;
private Map<String,Object> application;
}
- 通过ActionContext获取
public class UserAction2 extends ActionSupport{
private Map<String,Object> request;
private Map<String,Object> session;
private Map<String,Object> application;
public UserAction2(){
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
}
跳转方式.
Dispatcher
result属性默认值为dispatcher,表示请求转发到指定的jsp页面
redirect
表示重定向到jsp页面
chain
请求转发到指定的Action
redirectAction
重定向到执行的Action
注:当跳转的action不在当前namespace下时可以加参
<result name="success" type="chain">
<param name="actionName">r1</param>
<param name="namespace">/user</param>
</result>
配置注意:
Include配置
实际开发中通常一个模块一个struts配置文件
<struts>
<constant name="struts.devMode" value="true" />
<include file="struts_user.xml"></include>
</struts>
全局配置
<global-results>
<result name="error">/error.jsp</result>
</global-results>
OGNL表达式(对象图导航语言)
action对象是存储在值栈中的,页面提交的数据会通过ognl给action中的属性及对象赋值,页面取值的时候,也是通过ognl从值栈中获取。
写法:
<%--导入标签库--%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%--要想使用OGNL表达式,需要借助struts2的标签--%>
<s:property value="OGNLExpression"/>
作用:
把value属性取值所对应的内容输出到浏览器上。注意:它不是把value的值输出到浏览器上。
属性:
value:取值是一个OGNL表达式。
Struts标签
Property
Set
Debug
Date
Include
If
Iterator
Generator
关于访问
首页引入:
<%@ taglib prefix="s" uri="/struts-tags"%>
值栈中的对象的不使用#,非值栈中的对象使用#
简单点理解:当前action,或者处于action链中的action所拥有的属性,
并且为该属性提供了getter和setter方法,那么在jsp中就不需要使用#,除此之外需要使用#,
那么从这里你就可以知道action的属性如果提供了getter和setter方法,那么这些属性值就会放置到值栈中
Struts值栈ValueStack
ValueStack
ValueStack在中文版的《Struts2深入浅出》一书中译作“值栈”。其本身数据结构是一个栈,使用者可以把一些对象(又称作
bean)存入值栈中,然后使用动态的表达式来读取bean的属性,或者对bean进行一些其他操作。由于值栈中可能有多个bean,
值栈会按bean出栈的顺序依次尝试使用动态的表达式来读取值,直到成功读取值为止。在Struts2中,默认的值栈实现是
OgnlValueStack,即默认使用Ognl这个动态表达式语言来读取值。
在Struts2执行一次请求的过程中,Struts2会把当前的Action对象自动放入值栈。这样,在渲染JSP时,JSP里的代码使用
<s:property value="..."/>之类标签中的Ognl表达式会直接作用于Action对象,从而方便的读取Action的属性。
ActionContext
ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,比如session, parameters,
locale等。Struts2会根据每个执行HTTP请求的线程来创建对应的ActionContext,即一个线程有一个唯一的ActionContext。
因此,使用者可以使用静态方法ActionContext.getContext()来获取当前线程的ActionContext,也正是由于这个原因,使用者不用
去操心让Action是线程安全的。
无论如何,ActionContext都是用来存放数据的。Struts2本身会在其中放入不少数据,而使用者也可以放入自己想要的数据。
ActionContext本身的数据结构是映射结构,即一个Map,用key来映射value。所以使用者完全可以像使用Map一样来使用它,或
者直接使用Action.getContextMap()方法来对Map进行操作。
参考https://www.cnblogs.com/keyi/p/6230242.html
拦截器
过滤器:对所有的东西都过滤。包括css,.js,.jpg等。
拦截器:只对action拦截。是struts工具。
Struts2 拦截器是在访问某个 Action 或 Action 的某个方法,字段之前或之后实施拦截,并且 Struts2 拦截器是可
插拔的,拦截器是AOP的一种实现.
优点:通用功能的封装,提供了可重用性;
Struts2 拦截器原理:
Struts2拦截器是在访问某个Action或Action的方法之前或之后实施拦截。在请求Struts2的Action时,Struts2会查找配置文件,并
根据配置文件实例化相应的拦截器对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!