Struts2笔记

Struts2笔记

入门

核心点 1. 拦截器intercepto 2. Action 3. ognl表达式与valueStack 基本原理 1. 当通过浏览器发送一个请求 2. 会被StrutsPrepareAndExecuteFilter拦截 3. 会调用struts2框架默认的拦截器(interceptor)完成部分功能 4. 在执行Action中操作 5. 根据Action中的方法的执行结果来选择来跳转页面Result视图

Struts2配置文件加载顺序

  1. 第一个加载的是default.properties文件,主要声明了struts2框架的常量
  2. 加载的是一批配置文件
    • Struts-default.xml声明了interceptor result bean
    • Struts-plugin.xml用于插件的配置声明
    • Struts.xml用于我们自己工程使用struts2框架的配置
  3. 加载自定义的struts.properties,用于定制常量
  4. 自定义配置提供
  5. 加载web.xml
  6. bean相关配置

struts.xml文件配置

主要有四个标签 1. package有四个属性 - name属性,就是一个包的名字没啥用 - namespace 决定框架会处理来自哪个路径提交的请求 - extends 指定继承自哪个包,一般是struts-default,如果用到json传输数据,会是json-default - abstruct 没啥用 2. action - name属性 与namespace联合使用来确定一个action的访问路径 - class属性 用于指定相应本次请求的当前action类 - method属性 用于指定本次请求当前的action类中的哪个方法执行 3. result 可以配置一组result通过不同的返回值来实现不同的跳转 - name属性 与method的方法的返回值进行匹配,来确定跳转路径 - type 属性常见类型 如下 - dispatcher 默认值,就是转发,返回页面 - chain 转发到一个Action - redirect 重定向到一个URL - redirectAction 重定向到一个Action - strean 向浏览器发送一个流,通常用于文件下载, - json 需要先继承json-default用于异步请求 4. constant 用于声明常量,常见的配置如下
    <?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>

    <!-- 把它设置为开发模式,发布时要设置为false -->
    <constant name="struts.devMode" value="true" />
    <!-- 设置在class被修改时是否热加载,发布时要设置为false -->
    <constant name="struts.convention.classes.reload" value="true"/>
    <!-- 自动动态方法的调用,使用这个设置后可以这样调用:action!method -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <!-- 指定jsp文件所在的目录地址 -->
    <constant name="struts.convention.result.path" value="/WEB-INF/content/" />
    <!-- 使用struts-default默认的转换器,如果是rest的使用:rest-default,rest需要rest的jar插件 -->
    <constant name="struts.convention.default.parent.package" value="struts-default"/>
    <!-- 用于配置包名后缀。默认为action、actions、struts-->
    <constant name="struts.convention.package.locators" value="actions" />
    <!-- 用于配置类名后缀,默认为Action,设置后,Struts2只会去找这种后缀名的类做映射 -->
    <constant name="struts.convention.action.suffix" value="Action"/>
    <!-- 设置即使没有@Action注释,依然创建Action映射。默认值是false。因为Convention-Plugin是约定优于配置的风格,
        可以不通过注解根据预先的定义就能访问相应Action中的方法 -->
    <constant name="struts.convention.action.mapAllMatches" value="true"/>
    <!-- 自定义jsp文件命名的分隔符 -->
    <constant name="struts.convention.action.name.separator" value="-" />
    <!-- 国际化资源文件名称 -->
    <constant name="struts.custom.i18n.resources" value="i18n" />
    <!-- 是否自动加载国际化资源文件  -->
    <constant name="struts.i18n.reload" value="true" />
    <!-- 浏览器是否缓存静态内容 -->
    <constant name="struts.serve.static.browserCache" value="false" />
     <!-- 上传文件大小限制设置 -->
    <constant name="struts.multipart.maxSize" value="-1" />
    <!-- 主题,将值设置为simple,即不使用UI模板。这将不会生成额外的html标签 -->
    <constant name="struts.ui.theme" value="simple" />
    <!-- 编码格式 -->
    <constant name="struts.i18n.encoding" value="UTF-8" />

</struts>

Action类

可以通过继承ActionSupport来创建Action类 可以通过通配符来简化action访问方式
<action name = "book_*" class="BookAction" method={1}</action>

Action类中获取页面请求参数

有两种方式,分别是模型驱动和属性驱动 1. 模型驱动 - action类只要实现ModelDriven接口,从页面中获取到的参数就会自动赋值给对应的实体 2. 属性驱动 - 直接在action类中提供与请求参数匹配的set方法,也能直接获取到参数 分析: 首先框架中有一个类实现了一个拦截器,然后被拦截到,对值栈中分装的参数进行分析,用反射的方式尝试调用参数对应的set方法,如果成功,也就实现了赋值.

获取servletAPI

两种方式 - 通过ServletActionContext静态方法获取 - 获取request ServletActionContext.getRequest() - 获取response ServletActionContext.getRequest() - 获取servletContext ServletActionContext.getRequest() - 通过实现注入的方法实现 - 获取request 实现ServletRequestAware接口可以获取. - 获取response 实现ServletResponseAware接口可以获取 - 获取servletContext 实现ServletContextAware接口可以获取.
public class BaseAction implements ServletRequestAware, ServletResponseAware,  
        StrutsStatics {  
    protected HttpServletRequest request;  

    protected HttpServletResponse response;  

    public void setServletRequest(HttpServletRequest request) {  
        this.request = request;  

    }  

    public void setServletResponse(HttpServletResponse response) {  
        this.response = response;  
    }  
}  

OGNL表达式与ValueStack

  • 获取ValueStack
//通过ActionContext来获取值栈
ValueStack valueStack = ActionContext.getContext().getValueStack();
  • 向ValueStack存储数据
//第一种方法,直接压栈
valueStack.push("itcast");
//第二种方法,将参数分装到了一个hashMap中
valueStack.set("username","tom");
  • 利用OGNL表达式从值栈中获取数据
    • 要使用OGNL表达式,就先要在jsp文件的页首声明
      
      <%@taglib prefix="s" uri="/struts-tags"%>
    • 如果是push方法存入的数据
      <!-- 根据在值栈中的位置获取 -->
      <s:property value = "[0].top"/>
    • 如果是用set方法存入的数据
      <!-- 根据对应键查找值 -->
      <s:property value = "name"/>

interceptor拦截器

关于拦截器的详细介绍: Struts2拦截器
我们使用拦截器可以在action执行前后进行处理工作,之前的工作可以模拟过滤器的效果,之后可以模拟监听器的效果 所有的Interceptor都要实现一个接口 com.opensymphony.xwork2.interceptor.Interceptor
接口有三个方法,分别是
  • init()用于创建
  • destory()用于销毁
  • intercept(ActiongInvocation invocation)用于做处理
只需要在应用程序struts.xml文件中通过 <include file="struts-default.xml" />将struts-default.xml文件包含进来,并继承其中的struts-default包(package),最后在定义Action时,使用 <interceptor-ref name="xx" />引用拦截器或拦截器栈(interceptor stack)

Struts2的注解开发

要使用Struts2的注解,我们必须引入一个jar包 pom坐标如下
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-convention-plugin</artifactId>
            <version>${struts2.version}</version>
        </dependency>
常用注解 - @Namespace 来代替 <package namespace=""> - @ParentPackage来代替 <package extends=""> - @Action 来描述关于 <Action>的配置 - value用于描述Action的name属性 - result用来描述结果类型的配置 <result> - type用来描述返回结果的类型相当于type属性 - location属性用于替代以前写在Action标签中的返回路径 - @Actions的作用是通过多个映射来访问同一个action - @InterceptorRef用于指定拦截器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
04-26
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值