struts2_day01
struts2是什么:运行在web层,负责处理请求
struct2负责处理前端的请求
struts2使用优势:
自动封装参数,
参数校验,
结果的处理(转发|重定向),
国际化,
显示等待页面,
表单的防止重复提交
struts2具有更加先进的架构以及思想
struts和struts2区别就是历史上没有什么关系
搭建struts2框架
1.导包
2.书写Action类
3.配置
<struts>
<package name="hello" namespace="/hello" extends="struts-default">
<action name="HelloAction" class="xxx.xxx.HelloAction" method ="hello">
<result name="success">/hello.jsp </result>
</action >
</package>
</struts>
package元素:将Action配置封装,就是可以在Package中配置很多action.
name属性:给包起个名字,起到标识作用,随便起,不能与其他包名重复
namespace属性:给action的访问路径定义一个命名空间
extends属性:继承一个指定包,必须继承 struts-default
abstract属性:包是否为抽象,标识性属性,表示该包不能独立运行
action元素:配置action类
name属性:决定Action访问资源名
class属性:action类的完整类名
method属性:指定调用action中的哪个方法来处理请求
result元素:结果配置
name属性:标识结果处理的名称,与action方法的返回值对应
type属性:指定调用哪一个result类处理结果(默认使用转发)
标签体:填写页面相对路径
include元素:引入外部配置文件
4.将struts2核心过滤器配置到web.xml
拦截器:
1.表面上,拦截器帮我们封装了很多功能
2.拦截器优秀的设计,可插拔式设计
3.app思想
aop面向切面编程
纵向重复代码,横向抽取
struts2常量配置
struts2默认常量配置位置
修改struts2常量配置(方式先后也是加载顺序-后加载覆盖前加载)
方式一:在struts.xml加constant元素(重点)
方式二:在src下创建struts.properties
方式三:在项目的web.xml中
常量配置:
struts.i18n.encoding = UTF-8:i18n:国际化.解决post提交乱码
struts.action.extension = action,,
指定访问action的后缀名
struts.devMode = true (默认false)
指定struts2是否以开发模式运行
1.热加载主配置(不需要重启)
2.提供更多的错误信息输出,方便开发调试
struts2配置的进阶
动态方法调用(重点)
方式一:配置动态方法调用常量
struts.enable.DynamicMethodInvocation = true (默认false)
Action!方法();
方式二(重点):
参数占位符*
Action_* method={1}
访问:Action_方法名
struts2中的默认配置
method属性默认:excute
result-name属性默认:success
result-type属性默认:dispatcher 转发
class属性默认:com.opensymphony.xwork2.ActionSupport
<defalut-action-ref name="xxx">如果找不到访问的action 则访问xxx
action类详解
Action类的书写方式:
方式一.创建一个类,可以是POJO(不继承任何父类,也不需要实现任何接口的类)使struts2框架的代码侵入性更低
方式二.实现一个Action接口(xwork2),里面有excute方法,提供action方法的规范,Action接口预置了一些字符串,可以在返回结果时使用,为了方便.
方式三(常用):继承一个类ActionSupport帮我们实现了一系列接口.如果需要用到这些接口的实现时,不需要自己实现.
struts-day02
结果跳转方式
转发
重定向
type="redirect"
转发到Action
type="chain"
<param name = "actionName">xxxxAction</param>
<param name = "namespace">/</param>
重定向到Action
type="redirectAction"
<param name = "actionName">xxxxAction</param>
<param name = "namespace">/</param>
访问servletAPI方式
如何在action中获得原生servlet
ActionContext数据中心 Map
原生request HttpServletRequest
原生response HttpServletResponse
原生ServletContext ServletContext
request域 Map
session域 Map
Application域 Map
param参数 Map
attr域 Map3个域合一(以小域为准)
ValueStack 值栈
....
生命周期:每次请求时都会创建一个与请求对应的ActionContext对象.请求处理完ActionContext销毁
如何获得ActionContext.
struts2将ActionContext对象创建好之后与当前线程绑定.我们只需要从ThreadLocal中获得
获得requet域
ActionContext.getContext().get("request")
struts2不推荐使用原生的request
希望你直接放入ActionContext域中
实现接口方式
如何获得参数
struts2参数获得方式:
一.属性驱动:
提供与参数键名相同的属性,自动类型转换:只能转换八大基本类型以及对应包装类+支持特定类型字符串转换 Date类型(格式:xxxx-xx-xx)
private String name;和get.set方法
二.对象驱动:
private User user属性
jsp中name="user.name"...
三.模型驱动
准备user成员变量 Action实现ModelDriven<User>
重写方法 return user
集合类型参数封装
action的生命周期:
每次请求Action时都会生成新的Action实例对象
MVC设计思想 M 业务模型 V 视图 C 控制
strutsMVC
struts-day03
OGNL表达式
OGNL:对象 视图 导航 语言
例:${user.addr.name}
OGNL不仅可以视图导航,支持比EL表达式更加丰富的功能
使用OGNL:
导包:struts2包中已经包含
代码准备:
OGNLContext OGNL上下文对象
ROOT:放置任何对象作为root都可以
Context:放置Map
OGNL表达式从ROOT和Context中取
OGNL表达式--取值
取root: 直接写属性名
取context: #键名.属性名
OGNL表达式--赋值
向root中赋值
Ognl.getValue("属性名='xxx'",oc.oc.getRoot() )
向context中赋值
"#键名.属性名='xxx'"
OGNL表达式--调用方法
@完整类名@方法名()
OGNL表达式--创建list 和 map对象
list:"{'xxx','xxxx'}"
map:"#{'name':'xxx'}"
OGNL与struts的结合
OGNLContext:
ValueStack:值栈
由两部分构成
一部分叫root ,放置的是一个栈
一部分叫Context ,放置的是ActionContexy数据中心
取栈中属性,会从栈顶开始找
默认情况下:栈中放置当前访问的Action对象
struts2与ognl结合体现
参数接收
实现模型驱动只需在赋值前,将对象压入栈顶
实现prepare
如果添加的参数struts无法识别,就会作为参数附加到重定向的的路径之后,如果参数是动态的,可以使用${}ognl表达式,动态取值
request.getAttribute()
1原生request域
2查找ValueStack的栈(root)部分
3查找ValueStack的Context部分(ActionContext)
struts2-day4
<global-exception-maping>
<exception-mapping result="error" exception="异常完整类名">
</global-exception-maping >
<action>
<result name="error">xxx.jsp</result>
</action>
拦截器:
拦截器生命周期:随着项目启动而创建,随着项目关闭而销毁
创建方式:
第一种:实现Intercepter接口 重写方法(不用)
第二种:继承AbstractInterceptor,只用重写一个方法
第三种:继承MethodFiterInterceptor
功能:定制拦截器拦截方法
定制哪些方法需要拦截和哪些不需要拦截
前处理
放行:invocation.invoke()
后处理
不放行直接return 直接跳转到jsp 不执行后续拦截器和action
配置
1.注册拦截器
2.注册拦截器栈
3.指定默认拦截器栈
建议放在默认拦截器之前
为Action单独指定走那个拦截器栈
excludeMethods:不拦截
includeMethods:拦截
二选一
struts2是什么:运行在web层,负责处理请求
struct2负责处理前端的请求
struts2使用优势:
自动封装参数,
参数校验,
结果的处理(转发|重定向),
国际化,
显示等待页面,
表单的防止重复提交
struts2具有更加先进的架构以及思想
struts和struts2区别就是历史上没有什么关系
搭建struts2框架
1.导包
2.书写Action类
3.配置
<struts>
<package name="hello" namespace="/hello" extends="struts-default">
<action name="HelloAction" class="xxx.xxx.HelloAction" method ="hello">
<result name="success">/hello.jsp </result>
</action >
</package>
</struts>
package元素:将Action配置封装,就是可以在Package中配置很多action.
name属性:给包起个名字,起到标识作用,随便起,不能与其他包名重复
namespace属性:给action的访问路径定义一个命名空间
extends属性:继承一个指定包,必须继承 struts-default
abstract属性:包是否为抽象,标识性属性,表示该包不能独立运行
action元素:配置action类
name属性:决定Action访问资源名
class属性:action类的完整类名
method属性:指定调用action中的哪个方法来处理请求
result元素:结果配置
name属性:标识结果处理的名称,与action方法的返回值对应
type属性:指定调用哪一个result类处理结果(默认使用转发)
标签体:填写页面相对路径
include元素:引入外部配置文件
4.将struts2核心过滤器配置到web.xml
拦截器:
1.表面上,拦截器帮我们封装了很多功能
2.拦截器优秀的设计,可插拔式设计
3.app思想
aop面向切面编程
纵向重复代码,横向抽取
struts2常量配置
struts2默认常量配置位置
修改struts2常量配置(方式先后也是加载顺序-后加载覆盖前加载)
方式一:在struts.xml加constant元素(重点)
方式二:在src下创建struts.properties
方式三:在项目的web.xml中
常量配置:
struts.i18n.encoding = UTF-8:i18n:国际化.解决post提交乱码
struts.action.extension = action,,
指定访问action的后缀名
struts.devMode = true (默认false)
指定struts2是否以开发模式运行
1.热加载主配置(不需要重启)
2.提供更多的错误信息输出,方便开发调试
struts2配置的进阶
动态方法调用(重点)
方式一:配置动态方法调用常量
struts.enable.DynamicMethodInvocation = true (默认false)
Action!方法();
方式二(重点):
参数占位符*
Action_* method={1}
访问:Action_方法名
struts2中的默认配置
method属性默认:excute
result-name属性默认:success
result-type属性默认:dispatcher 转发
class属性默认:com.opensymphony.xwork2.ActionSupport
<defalut-action-ref name="xxx">如果找不到访问的action 则访问xxx
action类详解
Action类的书写方式:
方式一.创建一个类,可以是POJO(不继承任何父类,也不需要实现任何接口的类)使struts2框架的代码侵入性更低
方式二.实现一个Action接口(xwork2),里面有excute方法,提供action方法的规范,Action接口预置了一些字符串,可以在返回结果时使用,为了方便.
方式三(常用):继承一个类ActionSupport帮我们实现了一系列接口.如果需要用到这些接口的实现时,不需要自己实现.
struts-day02
结果跳转方式
转发
重定向
type="redirect"
转发到Action
type="chain"
<param name = "actionName">xxxxAction</param>
<param name = "namespace">/</param>
重定向到Action
type="redirectAction"
<param name = "actionName">xxxxAction</param>
<param name = "namespace">/</param>
访问servletAPI方式
如何在action中获得原生servlet
ActionContext数据中心 Map
原生request HttpServletRequest
原生response HttpServletResponse
原生ServletContext ServletContext
request域 Map
session域 Map
Application域 Map
param参数 Map
attr域 Map3个域合一(以小域为准)
ValueStack 值栈
....
生命周期:每次请求时都会创建一个与请求对应的ActionContext对象.请求处理完ActionContext销毁
如何获得ActionContext.
struts2将ActionContext对象创建好之后与当前线程绑定.我们只需要从ThreadLocal中获得
获得requet域
ActionContext.getContext().get("request")
struts2不推荐使用原生的request
希望你直接放入ActionContext域中
实现接口方式
如何获得参数
struts2参数获得方式:
一.属性驱动:
提供与参数键名相同的属性,自动类型转换:只能转换八大基本类型以及对应包装类+支持特定类型字符串转换 Date类型(格式:xxxx-xx-xx)
private String name;和get.set方法
二.对象驱动:
private User user属性
jsp中name="user.name"...
三.模型驱动
准备user成员变量 Action实现ModelDriven<User>
重写方法 return user
集合类型参数封装
action的生命周期:
每次请求Action时都会生成新的Action实例对象
MVC设计思想 M 业务模型 V 视图 C 控制
strutsMVC
struts-day03
OGNL表达式
OGNL:对象 视图 导航 语言
例:${user.addr.name}
OGNL不仅可以视图导航,支持比EL表达式更加丰富的功能
使用OGNL:
导包:struts2包中已经包含
代码准备:
OGNLContext OGNL上下文对象
ROOT:放置任何对象作为root都可以
Context:放置Map
OGNL表达式从ROOT和Context中取
OGNL表达式--取值
取root: 直接写属性名
取context: #键名.属性名
OGNL表达式--赋值
向root中赋值
Ognl.getValue("属性名='xxx'",oc.oc.getRoot() )
向context中赋值
"#键名.属性名='xxx'"
OGNL表达式--调用方法
@完整类名@方法名()
OGNL表达式--创建list 和 map对象
list:"{'xxx','xxxx'}"
map:"#{'name':'xxx'}"
OGNL与struts的结合
OGNLContext:
ValueStack:值栈
由两部分构成
一部分叫root ,放置的是一个栈
一部分叫Context ,放置的是ActionContexy数据中心
取栈中属性,会从栈顶开始找
默认情况下:栈中放置当前访问的Action对象
struts2与ognl结合体现
参数接收
实现模型驱动只需在赋值前,将对象压入栈顶
实现prepare
如果添加的参数struts无法识别,就会作为参数附加到重定向的的路径之后,如果参数是动态的,可以使用${}ognl表达式,动态取值
request.getAttribute()
1原生request域
2查找ValueStack的栈(root)部分
3查找ValueStack的Context部分(ActionContext)
struts2-day4
<global-exception-maping>
<exception-mapping result="error" exception="异常完整类名">
</global-exception-maping >
<action>
<result name="error">xxx.jsp</result>
</action>
拦截器:
拦截器生命周期:随着项目启动而创建,随着项目关闭而销毁
创建方式:
第一种:实现Intercepter接口 重写方法(不用)
第二种:继承AbstractInterceptor,只用重写一个方法
第三种:继承MethodFiterInterceptor
功能:定制拦截器拦截方法
定制哪些方法需要拦截和哪些不需要拦截
前处理
放行:invocation.invoke()
后处理
不放行直接return 直接跳转到jsp 不执行后续拦截器和action
配置
1.注册拦截器
2.注册拦截器栈
3.指定默认拦截器栈
建议放在默认拦截器之前
为Action单独指定走那个拦截器栈
excludeMethods:不拦截
includeMethods:拦截
二选一