Struts2(一)

  • Struts入门
    Struts2的概念和作用:
    Struts概念:是Apache下的java开源框架,基于MVC设计模式的应用框架,本质上相当于Servlet(用来处理页面传送参数,处理响应),Struts最为MVC中的控制器来建立模型和视图的数据交互,是一个基于MVC的web应用框架,是解决表现层的逻辑框架,

Web层:Servlet+JSP、Struts2、SpringMVC
Service(业务层):Spring
数据层(Dao):JDBC、DBUtils、Hibernate等Mybatis、Ibatis

核心过滤器:StrutsPrepareAndExecuteFilter

Struts2执行流程:
核心过滤器:StrutsPrepareAndExecuteFilter
(做了准备+执行操作)
会执行过滤器的初始化方法init —-加载struts内部配置文件,包含了struts.xml文件
执行doFilter方法:先执行拦截器(可能是多个),访问Action类的方法,根据action名字找到对应的class和方法(利用反射机制调用Action类中的方法)
返回字符串:
<result name ="success"></result>
返回视图字符串,对应的页面可以访问

这里写图片描述
这里写图片描述

Struts配置文件加载:
Struts2在我们的初始化过程中,在核心过滤器调用init会加载配置文件,加载6个配置文件:
default.properties(常量文件)
struts-default.xml(Struts核心配置,描述拦截器等)
struts-plugin.xml(Struts插件配置—这个文件是包含在插件包里面的,整合框架会用到)
struts.xml(开发者自己编写的)Struts2配置
struts.properties:Struts2的配置(一般不用,用上一个)
web.xml:web项目的核心描述文件

注意:以上这6个文件的位置在哪里?
Struts2核心包

/org/apache/struts2/default.properties
/struts-default.xml

以上的6个文件加载过程中,后面加载的文件会覆盖后面加载的参数(关键)

以上6个文件就是它的加载顺序,

Struts.xml配置文件解析:
package :包 :用户管理不同的Action
name 属性:包名:不同的package 对应不同的 name
extends 属性:继承文件: 我们的包可以继承struts-default包,继承之后会继承父包的所有特性
namesapce:区分不同的包的访问路径 eg:/base
访问时加上/base

action标签:动作类(依靠动作类)
name :动作类的名称,主要用于访问动作类的路径
calss:动作类的限定名称 映射对应的Class,用于Struts找到动作类
默认值:ActionSupport
method:动作类的执行方法,执行Action中的方法,默认值execute方法
result标签:

name 用于动作类方法的返回值进行匹配
默认值:success
type:视图的类型:如何跳转,(转发,重定向) 默认值,dispatcher(转发)—redirect
/success.jsp

Struts2常量文件修改:
default.properties:是常量文件,定义了struts2一些常量文件:

struts.action.extension=action,,
这个是struts2的访问后缀名 :可以是.do .action 或者不写

修改这个常量值,在default.properties是无法修改的,因为隶属于jar包下的内容,

可以修改的地方:struts.xml和web.xml:
struts.xml:

<constant name="struts.action.extension" value="do,,">

web.xml:
这里写图片描述

Action动作类的三种写法:
不实现接口和继承类:

实现Action接口
1)提供默认的execute方法,让Action更加标准
2)提供了五个开发中常用的视图常量:SUCCESS

必须实现Action中的execute方法
execute是struts的默认方法

继承ActionSupport

ActionSupport实际上实现了Action接口(Struts2内部类)

1)有了Action接口的好处
2)例如表单验证、国际化等功能
这里写图片描述

实际开发中推荐使用ActionSupport

Action类的访问三种方式:

1)传统的访问方式
这里写图片描述

这里写图片描述

配置繁琐
可读性很强

2)通配符的访问方式

这里写图片描述

要求用户的访问路径必须清楚
可能有些方法名称会冲突,所以修改方法名

可读性差一点
配置简单

3)动态的方法调用方式(了解)
在生产上不推荐使用,但是在struts2测试可以使用

!:感叹号后面跟方法
这里写图片描述

动态方法调用默认是关闭的,如果需要使用的时候需要在常量中开启即可

这里写图片描述

开启动态方式调用:
这里写图片描述

<constant name="struts.enable.DynamicMethodInvocation" value="true">

为什么Struts2是默认关闭的!开启这种方法是非常危险的,这个类中所有方法都可能被访问到,不建议使用测试可用

  • Struts2拦截器和请求数据封装
    result标签中的type=“”

这里写图片描述

试图类型主要是指定struts2采用什么样的方式进行跳转

dispatcher:转发到页面(地址栏不变,是在服务端进行的)
redirect:重定向到页面(地址栏会发生改变)
redirectAction:重定向到Action

这里写图片描述

文件下载用 stream类型

全局视图和局部视图

对于方法的权限的拦截
判断用户是否已经登陆

这里写图片描述

这里写图片描述

一个Action可以配置多个result ,这样是局部的,在action内部
这样的话login.jspde的reslut有些重复,所以可以抽取出来
全局视图的配置:配置在package内,action外部

这里写图片描述

全局视图特点:对当前包下的所有Action都是有效的
局部视图特点:只有对当前Action有效

注意事项:
局部视图的优先级会大于全局视图的优先性
如果在局部视图和全局视图都出现相同的视图,那么局部视图的优先级会大于全局视图的优先级(也就是所谓的覆盖)

Struts2中使用Servlet的API:
需求:从接受参数到把数据共享到页面 都需要通过Servlet,利用ServletAPI

这里写图片描述

1.使用ServletActionContext类

写入表单:姓名、性别、年龄

HttpServletRequest request = ServletActionContext.getRequest();

这里写图片描述

这里写图片描述

Struts对post提交做了处理 默认编码UTF-8

2.使用Struts2提供的ActionContext类
利用ActionContext

execute中方法:

ActionContext context = ActionContext.getParameters();
HttpParameters parameters = context.getParameters();

这里写图片描述

3.使用接口注入的方式
Action继承ActionSupport 并且实现了ServletRequestAware接口

这里写图片描述

这里写图片描述

这里写图片描述

实际开发中前面两个比较推荐使用
第三个侵入性比较高,需要实现接口和写大量代码

ServletActionContext实现原理:
这里写图片描述
底层调用的是ActionContext的方法,与ActionContext 本质是一样的

而第三种实现接口注入的方式 是由于struts2中的struts-default.xml文件中配置的拦截器实现的

这里写图片描述

ServeltConfigInterceptor拦截器
这里写图片描述

通过不同的Aware来实现注入

  • 拦截器的作用与实现
    拦截器:在AOP中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入一些操作,拦截是AOP的一中实现策略

拦截器 是动态拦截Action调用的对象,它提供了一种机制可以使开发这可以定义在一个action执行前后执行的代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分的方式(比如登陆判断,日志记录)

拦截器的开发步骤:
编写一个Action
1.编写拦截器类
需要实现一个接口:Interceptor
这里写图片描述
核心方法:intercept 方法,执行Action invoke()方法,可以在之前之后做一些操作

2.配置拦截器
在struts.xml文件中配置
1)定义拦截器
2)使用拦截器
这里写图片描述

全局拦截器和局部拦截器
以上就是局部拦截器,只对配置了拦截器的某一部分Action生效,其它无效

全局拦截器的配置:

<default-interceptor-ref name="MyInterceptor1">

这里写图片描述

全局拦截器,位置放在 定义拦截器的下方

  • *拦截器栈和默认拦截器栈
    拦截器栈:一个拦截器栈可以包含多个拦截器,
    可以使用拦截器栈哎拦截Action,多个拦截器同时施加到同一个Action

定义拦截器栈:

这里写图片描述

这里写图片描述

这里写图片描述

拦截器栈执行过程:

这里写图片描述

在实际开发中,定义拦截器栈比较多
struts-default.xml中定义了许多的拦截器以及许多的拦截器栈

默认拦截器栈

这里写图片描述

这里写图片描述

根据继承原则,所有的package都会继承默认配置文件的拦截器栈的内容

如果我们的包没有去自定义拦截器,那么会自动使用defaultStack,但是如果我们定义了拦截器,那么我们的默认栈会被覆盖,失效,比如自定义拦截器站,servletConfig也失效了

比如servletConfig拦截器就是属于默认的拦截器栈中的拦截器

这时就需要我们添加defaultStack

这里写图片描述

如果自定义拦截器,那么要手动加上默认的defaultStack

  • 请求参数的封装
    需求:以用户注册为例:

属性驱动封装
底层依靠拦截器实现:
这里写图片描述

普通属性的驱动
页面+action
利用action中的set方法
这里写图片描述

注意:表单上送字段和set方法中的字段必须一致

javaBean的驱动:

在Action中定义一个User对象 ,user对象的set和get方法,User类中的属性必须和表单一致,且有set、get方法,实现序列化接口Serializable

页面上:
这里写图片描述

这里写图片描述

模型驱动封装

这里写图片描述

模型驱动和属性驱动本质采用的拦截器不同,采用的方式也不同:
这里写图片描述

Action需要实现ModelDriven接口(需要泛型)User
写法比较简单,直接将对象属性封装为对象:

这里写图片描述

模型驱动不需要set、get方法,必须new对象
private User user = new User();

  • Struts2国际化功能
    需求:做一个国际化的登陆页面(i18n)

1.编写国际化的资源文件
2.新建message_zh_CN.properties

这里写图片描述

message_en_US.properties
这里写图片描述

加载国际化资源文件:靠常量文件加载

这里写图片描述

在struts.xml中配置:
这里写图片描述

struts2一启动就会加载国际化配置信息
前缀必须是message 后边不用写
这里写图片描述

在jsp页面使用国际化资源信息

引入标签(Struts2标签)
这里写图片描述

将jsp页面的元素换为properties文件中的key值

这里写图片描述

更改浏览器语言读取不同的国际化资源
在Action也可以使用国际资源化信息

这里写图片描述

  • Strust2的类型转换机制以及自定义转换器
    Struts2在我们请求参数的封装之前,其实自动会对参数进行类型转换
    比如前端传入年龄,成绩等,后台需要用对应的数据类型进行转换,Struts2可以完成自动转换

这里写图片描述

这里写图片描述

Struts2内部拥有类型转换的功能

但是Struts2对于日期类型,只支持yyyy-MM-DD的格式,如果是其他格式,Struts2是不支持的,比如yyyy/MM/DD,这个时候可以自定义类型转换器

自定义类型转换器:
编写自定义类型转换器

继承StrutsTypeConverter类,并且实现convertFromString(页面到Action),convertToString(Action到页面)

这里写图片描述

重写convertFromString

这里写图片描述

配置类型转换器:
在动作类的目录下建立一个文件Demo1Action-conversion.properties文件,内容这里写图片描述

中间必须以横岗-分隔

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值