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类中的方法)
返回字符串:

返回视图字符串,对应的页面可以访问

Struts2(一)_第1张图片
Struts2(一)_第2张图片

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:
Struts2(一)_第3张图片

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

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

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

继承ActionSupport

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

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

实际开发中推荐使用ActionSupport

Action类的访问三种方式:

1)传统的访问方式
Struts2(一)_第4张图片

Struts2(一)_第5张图片

配置繁琐
可读性很强

2)通配符的访问方式

Struts2(一)_第6张图片

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

可读性差一点
配置简单

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

!:感叹号后面跟方法
Struts2(一)_第7张图片

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

这里写图片描述

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

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

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

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

Struts2(一)_第8张图片

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

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

Struts2(一)_第9张图片

文件下载用 stream类型

全局视图和局部视图

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

Struts2(一)_第10张图片

Struts2(一)_第11张图片

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

Struts2(一)_第12张图片

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

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

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

Struts2(一)_第13张图片

1.使用ServletActionContext类

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

HttpServletRequest request = ServletActionContext.getRequest();

Struts2(一)_第14张图片

Struts2(一)_第15张图片

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

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

execute中方法:

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

Struts2(一)_第16张图片

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

Struts2(一)_第17张图片

Struts2(一)_第18张图片

Struts2(一)_第19张图片

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

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

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

ServeltConfigInterceptor拦截器
Struts2(一)_第20张图片

通过不同的Aware来实现注入

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

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

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

2.配置拦截器
在struts.xml文件中配置
1)定义拦截器
2)使用拦截器
Struts2(一)_第22张图片

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

全局拦截器的配置:

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

Struts2(一)_第23张图片

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

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

定义拦截器栈:

Struts2(一)_第24张图片

Struts2(一)_第25张图片

Struts2(一)_第26张图片

拦截器栈执行过程:

Struts2(一)_第27张图片

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

默认拦截器栈

这里写图片描述

Struts2(一)_第28张图片

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

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

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

这时就需要我们添加defaultStack

Struts2(一)_第29张图片

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

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

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

普通属性的驱动
页面+action
利用action中的set方法
Struts2(一)_第30张图片

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

javaBean的驱动:

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

页面上:
Struts2(一)_第31张图片

Struts2(一)_第32张图片

模型驱动封装

这里写图片描述

模型驱动和属性驱动本质采用的拦截器不同,采用的方式也不同:
Struts2(一)_第33张图片

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

Struts2(一)_第34张图片

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

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

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

Struts2(一)_第35张图片

message_en_US.properties
Struts2(一)_第36张图片

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

Struts2(一)_第37张图片

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

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

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

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

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

Struts2(一)_第38张图片

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

Struts2(一)_第39张图片

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

Struts2(一)_第40张图片

Struts2(一)_第41张图片

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

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

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

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

Struts2(一)_第42张图片

重写convertFromString

Struts2(一)_第43张图片

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

中间必须以横岗-分隔

你可能感兴趣的:(java基础知识点,开发)