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的创建方式

  1. 无侵(入门)
  2. 实现action接口
  3. 继承ActionSupport(常用)

调用Action中方法的方式

静态调用

<action method=”add”>

动态调用

访问路径使用感叹号user!addUser action中 不需要配置method

通配符

<action name="user*" class="com.lq.action.UserAction" method="{1}">

            <result name="success">

                /{1}_success.jsp

            </result>

        </action>

 

 

参数调用在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

  1. 实现接口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;

     }

 

  1. 通过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会查找配置文件,并

根据配置文件实例化相应的拦截器对象。

posted @   码农公子的幸福生活  阅读(30)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示