struts2 入门笔记

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:拦截
二选一

猜你喜欢

转载自blog.csdn.net/weixin_42236404/article/details/80963383