Struts2 完整笔记

MVC模式
MVC(Model-View-Controller 模型-视图-控制器)是一个存在于服务器表达层的模型。在MVC经典架构中,强制性地吧应用程序的输入、处理和输出分开,将程序分成3个核心模块——模型、视图、控制器

Struts2框架
Struts是Apache软件基金下的JAKARTA项目的一部分,它目前有两个版本(STRUTS1.X和STRUTS2.X)都是基于MVC经典设计模式的框架
Struts2的体系结构图

在web.xml中配置过滤器

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter



struts2
/*

1、三层架构
表现层:接收和处理请求(MVC模型它是一个表现层模型)。
业务层:处理程序业务需求。
持久层:对数据库操作。
2、MVC模型
M:Model 模型 作用是封装数据的。目前就是实体类作为模型
V:View 视图 作用是展示数据的。JSP/HTML
C:Controller 控制器 作用是控制程序流转的。Servlet/Filter
3、Servlet和Filter
共同点:
都有3个常用方法:初始化,销毁和核心方法(service,doFilter)
他们的核心方法都有response和request
他们都是单例对象,即一个应用只有一个对象
区别:
创建时间不一样:
Servlrt:请求一次到达时(默认情况下)
Filter:应用一加载就创建
Filter不是一个资源不能通过地址栏访问
Servlet是一个资源可以通过地址栏访问
4、问题:
访问时Servlet中有很多的if-else判断
解决判断过多的方式:BaseServlet
BaseServlet中有个问题:JSP中范文路径的method取值和Servlet的方法名绑定了。
解决上面的问题:可以使用配置文件。
添加分类

public class CategoryServlet extends HttpServlet{
public void addCategory(request,response)
}
}
·struts2中的6个配置文件
顺序 配置文件名 所在位置 说明
1 default.properties struts2-core…jar/org/apache/struts2 不能修改
2 struts-default.xml struts2-core…jar 不能修改
3 struts-plugin.xml struts2提供的插件jar包 不能修改
4 struts.xml 我们的应用中 我们修改的,推荐
5 struts.properties 我们的应用中 我们修改的
6 web.xml 我们的应用中 我们修改的可以给过滤器配置参数

标签

标签 后加载覆盖先加载

标签 动作类的三种创建方式

action的三种访问方式

标签 转发 重定向 用流输出

全局结果视图和局部结果视图

访问ServletAPI的两种方式
方式一:

方式二:
方式二重写接口中的方法:把声明的对象传进去
请求参数的封装
·第一种

注:
1、struts2框架会为我们解决post请求的中文乱码问题,但是get请求不解决
2、Struts为框架会自动为我们转换数据类型:
(1)基本类型
(2)字符串数组会按照“,”+“&nbsp”的方式拼接成字符串
(3)日期类型会按照本地格式转成日期类型
执行参数封装,是一个名称为params的拦截器实现的
封装规则只有一个,它要去指定的位置找属性,找到之后调用set方法赋值
·第二种(写一个User类作为实体类)

·第三种(写一个User类作为实体类)

模型驱动的实现,除了一个params拦截器之外,还需要一个叫modelDriven的拦截器配合

请求参数封装(复杂类型的封装)
·List类型

·Map类型

表单提交失败,数据回显(在请求参数封装的驱动模型方式下使用)

表单问题回显,使用<s:fielderror fieldName=””/>

Struts2 S标签设置表单问题自动回现

设置表单问题回显(中文)
在实体类的包中,以实体类命名如下文件(birthday错误回显)

·OGNL表达式的简单使用
OGNL(object graph navigation language):对象图导航语言(Java字符串和Java之间的桥梁)
OGNL表达式不仅可以获取数据,还可以存数据。
它可以调用Java对象的方法
user.name看上去是字符串,当它执行user对象的getName方法时,表示用OGNL表达式解释。
使用OGNL表达式获取数据,是我们在开发中经常使用的。
使用OGNL表达式实现给对象赋值,是Struts2框架做的。
#El表达式没有空指针异常,没有数组下标越界,没有字符串拼接#

访问静态方法需要在struts的配置问价中开启OGNL的静态方法开关:

Map中的value是标签的value

·OGNL上下文-ContextMap
他是Struts2框架中封装数据最大的容器,封装了一次请求会用到的所有数据。它是一个Map结构。Map的key是String类型,Map的value是Object类型。里面的内容包括但不限于如下内容:
                     |--application 它是一个Map,里面存应用域中的所有数据
              |--session 它是一个Map,里面存会话域中的所有数据
 context map-- |--request 它是一个Map,里面存请求域中的所有数据
           |--value stack(root) 它是一个对象,list结构
	   |--action (the current action) 对象,当前正执行的Action对象
          |--parameters 它是一个Map,存的是请求参数,request.getParmeterMap()
          |--attr (searches page, request, session, then application scopes)
	   Map,里面存的是四大域中的数据,并且查找顺序是按照由小到大的顺序
key String								value Object			
application				应用域中的所有数据(key String, value Object)
session					会话域中的所有数据(key String, value Object)
request					请求域中的所有数据(key String, value Object)
value stack(root)	(此处不是它的key)		value stack 对象

操作顺序:
1、获取ContextMap
2、根据key”application”获取里面的Map
Object obj = contextMap.get(“application”);
Map map = (Map)obj;
3、存入数据
·ActionContext以及它和ContextMap的关系
它是一个工具类,里面提供了便捷操作ContextMap的方法。
ActionContext的创建时间点,每次请求都会创建新的。放在struts2的核心过滤器的doFilter()方法。
由于Java ee应用是多线程的,它通过把ActionContext绑定到ThreadLocal上实现线程同步。我们通过代码得知,想要获取该对象,需要调用ActionContext的静态方法getContext(),从当前线程上获取。

借助s:property标签和OGNL表达式获取ActionContext中存入的数据

·ValueStack对象的使用
它也是一个工具类。它是一个list结构

我们使用OGNL表达式是能根据属性的名称获取属性的值
property name 属性显示的是实体类get方法后跟的部分(首字母小写)

Value Stack 的其他应用:

·Struts2中的EL表达式
EL表达式的搜索范围:
page request session servletContext(application)
由小到大逐个搜索,只要找到就不再搜索

当使用了Struts2之后,它对request进行了增强,改变了EL表达式的搜索顺序,所以以后还可以使用EL表达式。
·各种符号总结:
%:
1、把普通OGNL表达式转成字符串%{‘’}
2、把字符串转成OGNL表达式%{}
#:
1、获取ContextMap中的数据#key
2、在页面中创建Map集合
$:
1、EL表达式使用
2、可以在Struts2的配置中使用OGNL表达式(配置可以是xml文件,也可以是注解)
·Struts2中的迭代标签 :<s:iterator/>

没写var属性

·自定义拦截器

要想return返回值有用,在放行前执行返回

Struts2-AOP(把重复代码提取出来,统一管理动态增强)把拦截的功能写在拦截器里面

全局结果视图,登录视图

解决登录页面默认拦截器覆盖问题:
一:新建一个专门放登录的action

二:使用拦截器传参的方式告知拦截器那些方法需要拦截,那些方法不需要拦截
1、拦截器类继承MethodFilterInterceptor类(AbstractInterceptor的子类)

2、在拦截器栈的拦截器中使用参数告知拦截器拦截时,排除或包含的方法

·拦截器内视图

Interceptor(interface)
|--AbstractInterceptor(class)
|--ModelDrivenInterceptor(class)
|--ServletConfigInterceptor(class)
|--MethodFilterInterceptor(class)
|--MyInterceptor2(class自定义过滤器)
|--MyInterceptor1(class自定义过滤器)

Struts2注解jar包

·参数封装细节:
模型驱动ModelDriven

属性驱动:没有实体类。表单数据的接收都定义在动作类中(动作类中set方法赋值)

属性驱动有实体类(User类中set方法赋值)

·OGNL表达式和El表达式在HTML中的使用
OGNL只能使用在Struts2标签中,EL标签可以在HTML标签中使用

Action对象
Action对象是Struts2框架中的重要对象,主要用于HTTP请求
Action接口中的5个静态常量
SUCCESS、静态变量SUCCESS代表Action执行成功的返回值,在Action执行成功的情况下需要返回成功的页面,则可设置返回值为SUCCESS
NONE、静态变量NONE代表Action执行成功的返回值,但不需要返回到成功页面,主要用于处理不需要返回结果页面的业务逻辑
ERROR、静态变量ERROR代表Action执行失败的返回值,在一些信息验证失败的情况下可以使Action返回此值
INPUT、静态变量INPUT代表需要返回某个输入信息页面的返回值,如在修改某些信息时加载数据后需要返回到修改页面,即可将Action对象的返回值设置为INPUT
LOGIN、静态变量LOGIN代表需要用户登录的返回值,如在验证用户是否登录时Action验证失败并需要用户重新登录,即可将Action对象处理的返回值设置为LOGIN
请求参数的注入
在Struts2框架中,表单提交的数据会自动注入到Action对象中相应的属性,它与Spring框架中IOC注入原理相同,通过Action对象为属性提供的setter方法进行注入
例:

public calss UserAction extends ActionSupport{
private String username;//用户名属性
public void setUsername(String username){
this.username=username;
}//为username提供setter方法
public String getUsername(){
Return username;
}//为username提供getter方法
public String execute(){
Return SUCCESS;
}
}

Action的基本流程

动态Action
在Struts2框架中提供了Dynamic Action这样一个概念,称为动态Action。通过动态请求Action对象中的方法实现某一业务逻辑的处理

Struts2的配置文件类型

名称 说明
struts-default.xml 位于Struts2-core-2.3.4.jar文件的org.apache.Struts2包中
struts-plugin.xml 位于Struts2提供的各个插件包中
struts.xml Web应用默认的Struts2配置文件
struts.properties Struts2框架中属性配置文件
web.xml 此文件是web应用中的web.xml文件,在其中也可以设置struts2框架的一些信息

配置Struts2包



package属性
属性 说明
name 声明包的名称,方便在其他处引用此包,此属性是必须的
extends 用于声明继承的包,即其父包
namespace 指定名称空间,即访问此包下的action需要访问的路径
abstract 将包声明为抽象类型(包中不定义action)

配置名称空间
在java web开发中,web文件目录通常以模块划分,如用户模块的首页可以定义在“/user”目录中,其访问地址为“/user/index.jsp”

例:
添加用户
修改用户

Action的相关配置
Struts2框架中的action对象是一个控制器的角色,Struts2框架通过它处理HTTP请求,其请求地址的映射需要在struts.xml文件中使用元素配置,如:

success.jsp

属性 说明
name 用于配置Action对象配请求的URL映射
class 制动Action对象的类名
method 设置请求Action对象时调用该对象的那一个方法
Converter 指定Action对象类型转换器的类

使用通配符简化配置
在Struts2框架的配置文件struts.xml中支持通配符,此种配置方式主要针对多个Action的情况。通过一定的命名约定使用通配符来配置Action对象,从而达到一种简化配置的效果。
通配符:
*,匹配0个或多个字符
\,一个专一字如果需要匹配“/”,则使用“/”
例:

<struts>
<package name=”default” extends=”struts-default” namespace=”/”>
<action name=”*Action” class=”com.action.{1}Action”>
<result name=”success”>result.jsp</result>
<result name=”update”>update.jsp</result>
<result name=”del”>result.jsp</result>
</action>
</package>
</struts>

配置返回结果

<result name=”input” type=”dispatcher”>/user/input.jsp</result>

Struts2标签库

set标签
名称 是否必须 类型 说明
scope 可选 String 设置变量的作用域,取值为application、request、session、page和action,默认值为action
value 可选 String 设置变量值
var 可选 String 定义变量名
例:
<s:set var=”username” value=”测试set标签” scope=”request”></s:set>

property标签
名称 说明
default 可选
escape 可选
escapeJavaScript 可选
value 可选
例:
<s:property default=”没有数据!” value=”username”></s:property>

a标签
名称 是否必须 类型 说明
action 可选 String 将超链接的地址指向action
href 可选 String 超链接地址
id 可选 String 设置HTML中的属性名称
method 可选 String 如果超链接的地址指向action,method同时可以为action声明所调用的方法
namespace 可选 String 如果超链接的地址指向action,namespace可以为action声明名称空间

param标签
名称 是否必须 类型 说明
name 可选 String 设置参数名称
value 可选 Object 设置参数值

action标签
名称 是否必须 类型 说明
executeResult 可选 String 是否使Action返回执行结果,默认false
flush 可选 boolean 输出结果是否刷新,默认true
ignoreContextParams 可选 Boolean 是否将页面请求参数传入被调用的Action,默认false
name 必须 String Action对象映射的名称,即struts.xml中配置的名称
namespace 可选 String 指定名称空间的名称
var 可选 String 引用此action的名称

push标签用于将对象或值压入到值栈中并放置在顶部,因为值栈中的对象可以直接调用,所以标签的主要作用是简化操作。其属性只有value,用于声明压入值栈中的对象,该标签的使用方法如下:
<s:push value = “#request.student”></s:push>

date标签
名称 是否必须 类型 说明
format 可选 String 设置格式化日期的样式
name 必须 String 日期值
nice 可选 boolean 是否输出给定日期与当前日期之间的时间差,默认为false,不输出时间差
var 可选 String 格式化时间的名称变量,通过此变量可以对其进行引用

url标签
名称 是否必须 类型 说明
action 可选 String Action对象的映射URL,即对象的访问地址
anchor 可选 String 此URL的锚点
encode 可选 boolean 是否编码参数,默认true
escapeAmp 可选 String 是否将“&”转义为“&amp”
forceAddSchemeHostAnPort 可选 boolean 是否添加URL的主机地址及端口号,默认false
includeContext 可选 boolean 生成的URL是否包含上下文路径,默认true
includeParams 可选 String 是否包含可选参数,可选值为none,get和all,默认为none
method 可选 String 指定请求Action对象所调用的方法
namespace 可选 String 指定请求Action对象映射地址的名称空间
scheme 可选 String 指定生成URL所使用的的协议
value 可选 String 指定生成URL的地址值
var 可选 String 定义生成URL变量名称,可以通过此名称引用URL

控制标签

例:
<s:if test=”表达式(布尔值)”>
输出结果
</s:if>
<s:elseif test=”表达式(布尔值)”>
输出结果
</s:elseif>
<s:else”>
输出结果
</s:else>

iterator标签
名称 是否必须 类型 说明
begin 可选 Integer 指定迭代数组或集合的起始位置,默认0
end 可选 Integer 指定迭代数组或集合的结束位置,默认数组或集合的长度
status 可选 String 迭代过程中的状态
step 可选 Integer 设置迭代的步长,如果制定此值,则每次迭代后索引值将在原来索引值的基础上增加step的值,默认1
value 可选 String 指定迭代的集合或数组对象
var 可选 String 设置迭代元素的变量,如果指定此属性,那么迭代的变量将压入到值栈中

表单标签
在Struts2框架中Struts提供了一套表单标签,用于生成表单及其中的元素,如:文本框、密码框和选择框等
名称(标签) 说明
form 生成一个form表单
hidden 隐藏表单元素,相当于HTML代码
textfield 文本框元素,相当于HTML代码
password 密码框,相当于HTML代码
radio 单选框,相当于HTML代码
select 下拉列表框,相当于HTML代码
textarea 文本域,相当于HTML代码
checkbox 选择框,相当于HTML代码
checkboxlist 一个或多个选择框,相当于HTML代码…
submit 提交按钮,相当于HTML代码
reset 重置按钮,相当于HTML代码

Struts2的开发模式(实现与ServletAPI的交互)

实例化ActionContest
·在Struts2的API中,ActionContext的构造方法需要传递一个Map类的上下文对象,应用这个构造方法创建ActionContext对象非常的不方便。所以通常情况下使用该对象提供的getContext()方法创建,其声明如下:
·public static ActionContext getContext()
获取Map类型的request
·获取Struts2封装的Map类型的request使用ActionContext对象提供的get()方法,其方法声明如下:
·public Object get(Object key)
·该方法的入口参数为Object类型的值,获取request可以将其设置为request,如:
·Map request = ActionContext.getContext().get(“request”);
获取Map类型的session
·ActionContext提供了一个直接获取session的方法getSession(),其方法声明如下:public Map getSession()
·该方法返回Map对象,它将作用于HttpSession范围中
获取Map类型的application
·ActionContext对象为获取Map类型的application提供了单独的getApplication()方法,其声明如下:
·public Map getApplication()
·该方法返回Map对象,作用于ServletContext范围中

域模型DomainModel

驱动模型ModelDriven
在struts2框架的API中提供了一个名为ModelDriven的接口,Action对象可以通过实现此接口获取指定的实体对象。获取方式是实现该接口提供的getModel()方法

拦截器概述
拦截器实际是AOP的一种实现方式,通过它可以在ACTION执行前后处理一些相应的操作。
拦截器动态作用于Action与Result之间,可以动态地增强Action与Result

客户端发送的请求都会被Struts2的过滤器所拦截,此时Struts2对请求持有控制权,。它会创建Action的代理对象,并通过一系列的拦截器处理请求,最后交给指定的Action处理。

拦截器API
public interface Interceptor extends Serializable{
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
destroy()
·指定拦截器的声明周期结束,它在拦截器被销毁前调用,用于释放拦截器在初始化时占用的一些资源。
init()
·用于对拦截器执行一些初始化操作,此方法在拦截器被实例化后和intercept()方法执行前调用。
intercept()
·拦截器的主要方法,用于执行Action对象中的请求处理方法及前后的一些操作,动态增强Action的功能。
数据验证机制
手动验证
·在Struts2的API中ActionSupport类实现了Validateable接口,但对validate()方法却是一个空实现。

使用validate()方法要添加name为input的映射,如下:
<result name="input">/index.jsp</result>

验证文件的命名规则
以“ActionName-validation.xml”方式命名
·在这种命名方式中,数据的验证会作用于整个Action对象,并验证该对象的请求业务处理方法。若果Action对象中只存在单一的处理方法或多个请求处理方法中验证处理的规则相同,则可以应用此种命名规则。
以“ActionName-AliasName-validation.xml”方式命名
·以“ActionName-AliasName-validation.xml”方式命名更加灵活,如果一个Action对象中包含多个处理请求放啊,而又没必要验证每一个方法。即只需要处理Action对象中的特定方法,则可以使用此种命名方式。
?验证文件的编写风格
(1)字段验证器编写风格

<!-- 验证用户名 --!>
<field name=”username”>
<field-validator type=”requiredstring”>
<message>请输入用户名</message>
</field-validator>
</field>
<!-- 验证密码 --!>
<field name=”password”>
<field-validator type=”requiredstring”>
<message>请输入密码</message>
</field-validator>
</field>
</validators>
(2)非字段验证器编写风格
<validators>
<validator>
<!-- 验证用户名 --!>
<param name=”fieldName” >password</param>
<!-- 验证密码 --!>
<param name==”fieldName”>username</param>
<message>请输入密码</message>
</validator>
</validators>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值