Java学习笔记:Struts2初学
程序员文章站
2022-07-04 18:48:14
...
Struts2的文档结构:
WebRoot——WEB-INF——classes——class.files
——struts.xml
——web.xml
——lib
——JSP
——Static Resources
Object Graph Navigation Language,是一门功能强大的表达式语言,类似于EL。
Struts2默认采用OGNL表达式访问Action的数据,实际上是通过ValueStack对象来访问的Action。
OGNL表达式
1.基本属性
ID:1
Name:zhangsan
2.实体对象
用户名:zhangsan
密码:123456
3.数组和集合
数组中的城市:shanghai
集合中的城市:chongqing
4.Map
Map中的城市人口:2300万人口
5.访问时运算
My Name:My name is zhangsan
去哪:shanghai,我来了!
6.访问时调用方法
MY NAME:ZHANGSAN
7.创建集合
创建集合:[a, b, c]
集合类型:java.util.ArrayList
8.创建Map
创建Map:{mm=MM, nn=NN}
Map类型:java.util.LinkedHashMap
ValueStack
ValueStack是Struts2中,Action向页面传递数据的媒介。ValueStack封装了Action的数据,并允许JSP通过OGNL来对其进行访问。
1.观察ValueStack结构
[Debug]
2.栈顶
Stack Top:aaa@qq.com
3.输出context对象中的数据
context:zhangsan
4.遍历集合
员工:刘备 工资为:8000.0
员工:关羽 工资为:6000.0
员工:张飞 工资为:5000.0
5.循环数字
1 2 3
获取Session的方式
• ActionContext
○ ActionContext.getContext().getSession()
○ 返回类型为Map<String,Object>
• ServletActionContext
○ ServletActionContext.getRequest().getSession()
○ 返回类型为HttpSession
• SessionAware
○ 让Action实现SessionAware接口
○ 实现void setSession(Map<String,Object> session)方法,Struts2会在实例化Action后调用该方法,通过方法参数将Session对象注入进来
○ 定义成员变量,接收注入进来的Session对象
请求不用处理业务,Action类可以省略,在配置时class可以不指定,Struts2默认会实例化ActionSupport类,该类提供了默认业务方法execute并返回success。
默认类ActionSupport是在struts-default.xml中设定的。
Result组件
Result是用于做输出的组件,用于向页面输出一些内容,转发、重定向可以理解为特殊方法的输出。每一个Result实际上就是一个类,这些都实现了共同的接口Result
Struts预置了10种类型的Result,他们被定义在struts-default.xml中。
• dispatcher
○ 用于转发的Result,可以将请求转发给JSP
○ 此种类型Result对应的类为ServletDispatcherResult
○ 此类Result是Struts2默认的Result类型,该默认行为是定义该Result时,通过default="true"指定的
○ 在此之前,我们使用的Result都是这种默认的Result
• stream
○ 用于向页面输出二进制数据,此种类型的Result,可以将二进制数据输出到请求发起端
○ 此种类型Result对应的类为StreamResult
○ 用于将请求重定向给另一个Action
○ 用于向页面输出json格式的数据,此种类型的Result,可以将json字符串输出到请发起端
○ 此种类型Result对应的类为JSONResult
○ 此类Result不是Struts2默认的Result,但是的确是十分常用的类型
○ 输出一个Action属性
□ 指定属性为基本类型,则直接返回该属性值
□ 如果指定属性为实体对象,则返回格式如{"code":"bj01","name":"zs"}
□ 将Action中多个属性,做成json字符串,格式如{"id":"15","age","28"}
□ 将Action所有属性做成json字符串,格式如{"id":15,"name":"zs",age":"28","salary":8000}
○ 使用步骤
□ 导包
□ 修改包继承关系
□ 在struts.xml中,将Action所在package的继承改为json-default
□ 配置Action
□ 在struts.xml中,配置Action及Result
□ 异步请求
□ 在页面上发送异步请求,访问Action
□ 在JS回调函数中,处理请求返回结果
• FreeMarker
• chain
• HttpHeader
• Redirect
• Velocity
• XLS
• PlainText
拦截器
使用拦截器实现以下操作:
• 在调用action之前提供预处理逻辑。
• 在调用action后提供后处理逻辑。
• 捕获异常,以便可以执行备用处理。
Struts2框架拦截器
alias 允许参数在请求之间使用不同的别名。
checkbox 通过为未检查的复选框添加参数值false,以辅助管理复选框。
conversionError 将字符串转换为参数类型的错误信息放置到action的错误字段中。
createSession 自动创建HTTP会话(如果尚不存在)。
debugging 为开发人员提供一些不同的调试屏幕。
execAndWait 当action在后台执行时,将用户发送到中间的等待页面。
exception 映射从action到结果抛出的异常,允许通过重定向自动处理异常。
fileUpload 便于文件上传。
i18n 在用户会话期间跟踪选定的区域。
logger 通过输出正在执行的action的名称提供简单的日志记录。
params 设置action上的请求参数。
prepare 这通常用于执行预处理工作,例如设置数据库连接。
profile 允许记录action的简单分析信息。
scope 在会话或应用程序范围内存储和检索action的状态。
ServletConfig 提供可访问各种基于servlet信息的action。
timer 以action执行时间的形式提供简单的分析信息。
token 检查action的有效性,以防止重复提交表单。
WebRoot——WEB-INF——classes——class.files
——struts.xml
——web.xml
——lib
——JSP
——Static Resources
Struts的框架结构:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>firststruts</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!--
package:包,用于对Action进行封装
1.name:包名,根元素下可以有多个包,彼此之间不能重名。
2.extends:继承,用于指定继承的包,相当于将继承包下的配置信息复制到了当前包下。
3.namespace:命名空间,用于规定Action的访问路径,必须以"/"开头。
4.请求Action时,按照如下格式拼写URL:
http://IP:PORT/ProjectName/NAMESPACE/ACTIONNAME.action
-->
<package name="day01" namespace="/demo" extends="struts-default">
<!--
action:业务控制器,用于注册业务控制器组件(类)。
1.name:action名称,用于规定Action的访问路径。一个包下可以有多个action,彼此不能重名。
2.class:业务控制器组件,用于指定业务控制器对应的类。
3.method:方法,用于指定访问当前action时要调用的方法。
-->
<action name="hello" class="action.HelloAction" method="sayHello">
<!--
result:输出组件,用于转发、重定向、直接输出。
1.name:名称,一个action下可以有多个result,彼此之间不能重名。
2.默认做转发,标记内容设置成转发的页面。
-->
<result name="success">
/hello.jsp
</result>
</action>
</package>
</struts>
OGNLObject Graph Navigation Language,是一门功能强大的表达式语言,类似于EL。
Struts2默认采用OGNL表达式访问Action的数据,实际上是通过ValueStack对象来访问的Action。
OGNL表达式
1.访问基本属性
<h2>ID:<s:property value="id"/></h2>
<h2>Name:<s:property value="name"/></h2>
2.访问实体对象
<h2>用户名:<s:property value="user.username"/></h2>
<h2>密码:<s:property value="user.password"/></h2>
3.访问数组/集合
<h2>数组中的城市:<s:property value="cityArray[1]"/></h2>
<h2>集合中的城市:<s:property value="cityList[1]"/></h2>
4.访问Map
<h2>Map中的城市人口:<s:property value="cityMap.beijing"/></h2>
5.运算
<h2>My Name:<s:property value="'My name is '+name"/></h2>
<h2>去哪:<s:property value="cityArray[1]+',我来了!'"/></h2>
6.调用方法
<h2>MY NAME:<s:property value="name.toUpperCase()"/></h2>
7.常见集合
<h2>创建集合:<s:property value="{'a','b','c'}"/></h2>
<h2>集合类型:<s:property value="{'a','b','c'}.getClass().getName()"/></h2>
8.创建Map
<h2>创建Map:<s:property value="#{'mm':'MM','nn':'NN'}"/></h2>
<h2>Map类型:<s:property value="#{'mm':'MM','nn':'NN'}.getClass().getName()"/>
演示结果1.基本属性
ID:1
Name:zhangsan
2.实体对象
用户名:zhangsan
密码:123456
3.数组和集合
数组中的城市:shanghai
集合中的城市:chongqing
4.Map
Map中的城市人口:2300万人口
5.访问时运算
My Name:My name is zhangsan
去哪:shanghai,我来了!
6.访问时调用方法
MY NAME:ZHANGSAN
7.创建集合
创建集合:[a, b, c]
集合类型:java.util.ArrayList
8.创建Map
创建Map:{mm=MM, nn=NN}
Map类型:java.util.LinkedHashMap
ValueStack
ValueStack是Struts2中,Action向页面传递数据的媒介。ValueStack封装了Action的数据,并允许JSP通过OGNL来对其进行访问。
1.观察ValueStack结构
<h2><s:debug/></h2>
2.输出栈顶内容
<h2>Stack Top:<s:property/></h2>
3.输出Context对象中的数据
<h2>context:<s:property value="#action.user.username"/></h2>
4.遍历集合
<!-- 迭代标签 遍历集合 -->
<s:iterator value="emps">
<!-- 迭代过程中,栈顶为Emp对象,写出OGNL输出其属性值。 -->
员工:<s:property value="empName"/>
工资为:<s:property value="salary"/><br/>
</s:iterator>
5.按数字迭代
<!-- 迭代标签,按数字迭代 -->
<s:iterator begin="from" end="to" var="p">
<!-- 迭代过程中,栈顶为数字,但不能以数字为root写OGNL。此时可以声明变量p,通过Context对象实现对变量的访问。 -->
<s:property value="#p"/>
</s:iterator>
演示结果1.观察ValueStack结构
[Debug]
2.栈顶
Stack Top:aaa@qq.com
3.输出context对象中的数据
context:zhangsan
4.遍历集合
员工:刘备 工资为:8000.0
员工:关羽 工资为:6000.0
员工:张飞 工资为:5000.0
5.循环数字
1 2 3
获取Session的方式
• ActionContext
○ ActionContext.getContext().getSession()
○ 返回类型为Map<String,Object>
• ServletActionContext
○ ServletActionContext.getRequest().getSession()
○ 返回类型为HttpSession
• SessionAware
○ 让Action实现SessionAware接口
○ 实现void setSession(Map<String,Object> session)方法,Struts2会在实例化Action后调用该方法,通过方法参数将Session对象注入进来
○ 定义成员变量,接收注入进来的Session对象
请求不用处理业务,Action类可以省略,在配置时class可以不指定,Struts2默认会实例化ActionSupport类,该类提供了默认业务方法execute并返回success。
默认类ActionSupport是在struts-default.xml中设定的。
Result组件
Result是用于做输出的组件,用于向页面输出一些内容,转发、重定向可以理解为特殊方法的输出。每一个Result实际上就是一个类,这些都实现了共同的接口Result
Struts预置了10种类型的Result,他们被定义在struts-default.xml中。
• dispatcher
○ 用于转发的Result,可以将请求转发给JSP
○ 此种类型Result对应的类为ServletDispatcherResult
○ 此类Result是Struts2默认的Result类型,该默认行为是定义该Result时,通过default="true"指定的
○ 在此之前,我们使用的Result都是这种默认的Result
• stream
○ 用于向页面输出二进制数据,此种类型的Result,可以将二进制数据输出到请求发起端
○ 此种类型Result对应的类为StreamResult
○ 创建输出流,接到Action中定义的输入流将其输出
<result name="success" type="stream">
<param name="inputName">codeStream</param>
</result>
• redirectAction○ 用于将请求重定向给另一个Action
○ 此种类型Result对应的类为ServletActionRedirectResult
<result name="login" type="redirectAction">
<param name="namespace">
/命名空间
</param>
<param name="actionName">
action名
</param>
</result>
• json○ 用于向页面输出json格式的数据,此种类型的Result,可以将json字符串输出到请发起端
○ 此种类型Result对应的类为JSONResult
○ 此类Result不是Struts2默认的Result,但是的确是十分常用的类型
○ 输出一个Action属性
<result name="success" type="json">
<param name="root">属性名</root>
</result>
○ 格式□ 指定属性为基本类型,则直接返回该属性值
□ 如果指定属性为实体对象,则返回格式如{"code":"bj01","name":"zs"}
○ 输出多个Action属性
<result name="success" type="json">
<param name="includeProperties">
属性名1,属性名2,属性名3,…
</param>
</result>
○ 格式□ 将Action中多个属性,做成json字符串,格式如{"id":"15","age","28"}
○ 输出所有Action属性
<result name="success" type="json">
</result>
□ 格式□ 将Action所有属性做成json字符串,格式如{"id":15,"name":"zs",age":"28","salary":8000}
○ 使用步骤
□ 导包
□ 修改包继承关系
□ 在struts.xml中,将Action所在package的继承改为json-default
□ 配置Action
□ 在struts.xml中,配置Action及Result
□ 异步请求
□ 在页面上发送异步请求,访问Action
□ 在JS回调函数中,处理请求返回结果
• FreeMarker
• chain
• HttpHeader
• Redirect
• Velocity
• XLS
• PlainText
拦截器
使用拦截器实现以下操作:
• 在调用action之前提供预处理逻辑。
• 在调用action后提供后处理逻辑。
• 捕获异常,以便可以执行备用处理。
Struts2框架拦截器
alias 允许参数在请求之间使用不同的别名。
checkbox 通过为未检查的复选框添加参数值false,以辅助管理复选框。
conversionError 将字符串转换为参数类型的错误信息放置到action的错误字段中。
createSession 自动创建HTTP会话(如果尚不存在)。
debugging 为开发人员提供一些不同的调试屏幕。
execAndWait 当action在后台执行时,将用户发送到中间的等待页面。
exception 映射从action到结果抛出的异常,允许通过重定向自动处理异常。
fileUpload 便于文件上传。
i18n 在用户会话期间跟踪选定的区域。
logger 通过输出正在执行的action的名称提供简单的日志记录。
params 设置action上的请求参数。
prepare 这通常用于执行预处理工作,例如设置数据库连接。
profile 允许记录action的简单分析信息。
scope 在会话或应用程序范围内存储和检索action的状态。
ServletConfig 提供可访问各种基于servlet信息的action。
timer 以action执行时间的形式提供简单的分析信息。
token 检查action的有效性,以防止重复提交表单。
validation 提供action的验证支持。
创建拦截器组件
public class MyInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
//前部分处理
String output = "Pre-Processing";
System.out.println(output);
String result = invocation.invoke();
//后续处理
output = "Post-Processing";
System.out.println(output);
return result;
}
}
注册拦截器
<package name="helloworld" extends="struts-default">
<interceptors>
<interceptor name="别名"
class="实现类" />
</interceptors>
</package>
引用拦截器
<action name="hello" class="cn.w3cschool.struts2.HelloWorldAction" method="execute">
<interceptor-ref name="params"/>
<interceptor-ref name="拦截器" />
<result name="success">/HelloWorld.jsp</result>
</action>
拦截器堆栈
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servlet-config"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>