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类中的方法)
返回字符串:
返回视图字符串,对应的页面可以访问
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,,">
Action动作类的三种写法:
不实现接口和继承类:
实现Action接口
1)提供默认的execute方法,让Action更加标准
2)提供了五个开发中常用的视图常量:SUCCESS
必须实现Action中的execute方法
execute是struts的默认方法
继承ActionSupport
ActionSupport实际上实现了Action接口(Struts2内部类)
1)有了Action接口的好处
2)例如表单验证、国际化等功能
实际开发中推荐使用ActionSupport
Action类的访问三种方式:
配置繁琐
可读性很强
2)通配符的访问方式
要求用户的访问路径必须清楚
可能有些方法名称会冲突,所以修改方法名
可读性差一点
配置简单
3)动态的方法调用方式(了解)
在生产上不推荐使用,但是在struts2测试可以使用
动态方法调用默认是关闭的,如果需要使用的时候需要在常量中开启即可
开启动态方式调用:
<constant name="struts.enable.DynamicMethodInvocation" value="true">
为什么Struts2是默认关闭的!开启这种方法是非常危险的,这个类中所有方法都可能被访问到,不建议使用测试可用
试图类型主要是指定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文件中配置的拦截器实现的
通过不同的Aware来实现注入
拦截器 是动态拦截Action调用的对象,它提供了一种机制可以使开发这可以定义在一个action执行前后执行的代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分的方式(比如登陆判断,日志记录)
拦截器的开发步骤:
编写一个Action
1.编写拦截器类
需要实现一个接口:Interceptor
核心方法:intercept 方法,执行Action invoke()方法,可以在之前之后做一些操作
2.配置拦截器
在struts.xml文件中配置
1)定义拦截器
2)使用拦截器
全局拦截器和局部拦截器
以上就是局部拦截器,只对配置了拦截器的某一部分Action生效,其它无效
全局拦截器的配置:
<default-interceptor-ref name="MyInterceptor1">
全局拦截器,位置放在 定义拦截器的下方
定义拦截器栈:
拦截器栈执行过程:
在实际开发中,定义拦截器栈比较多
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();
1.编写国际化的资源文件
2.新建message_zh_CN.properties
加载国际化资源文件:靠常量文件加载
struts2一启动就会加载国际化配置信息
前缀必须是message 后边不用写
在jsp页面使用国际化资源信息
将jsp页面的元素换为properties文件中的key值
更改浏览器语言读取不同的国际化资源
在Action也可以使用国际资源化信息
Struts2内部拥有类型转换的功能
但是Struts2对于日期类型,只支持yyyy-MM-DD的格式,如果是其他格式,Struts2是不支持的,比如yyyy/MM/DD,这个时候可以自定义类型转换器
自定义类型转换器:
编写自定义类型转换器
继承StrutsTypeConverter类,并且实现convertFromString(页面到Action),convertToString(Action到页面)
重写convertFromString
配置类型转换器:
在动作类的目录下建立一个文件Demo1Action-conversion.properties文件,内容
中间必须以横岗-分隔