1.Struts2框架的学习路线
l 第一天:Struts2的概述、Struts2的入门、Struts2常见的配置、Struts2的Action的编写
l 第二天:Struts2的数据的封装、结果页面配置
l 第三天:Struts2的值栈和OGNL表达式
l 第四天:Struts2的标签库
2.Struts2的概述
2.1什么是Struts2
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。Apache Struts 2 是一种流行的 Java模型 - 视图 - 控制器(MVC)框架,成功地结合了 WebWork和Struts1.x 两种 web 框架。
l Struts2是一个基于MVC设计模式的WEB层框架。
n Struts2的内核相对于Struts1来讲已经发生巨大变化。
2.2常见的web层框架
l Struts2
l Struts1
l Webwork
l SpringMVC
2.3Web层框架基于前端控制器模型设计
3.Struts2的入门
3.1下载Struts2的开发环境
下载地址:http://struts.apache.org/
3.2解压Struts2开发包
l apps :Struts2提供的应用,war文件:web项目打成war包。直接放入到tomcat可以允许。
l docs :Struts2的开发文档和API
l lib :Strtus2框架的开发的jar包
l src :Struts2的源码
3.3创建web项目,引入jar包
l 引入jar包
n struts-blank项目lib文件夹下找jar包(struts-blank放到Tomcatwebapps解压)
3.4创建一个JSP页面
代码语言:javascript复制<body>
<h1>Struts2入门</h1>
<h3><a href="${pageContext.request.contextPath}/hello.action">Struts2入门</a></h3>
</body>
3.5编写Action的类
代码语言:javascript复制/**
* @Title: HelloAction.java
* @Package top.yangxianyang.demo1
* @Description: TODO(测试Strurs2)
* @author A18ccmsA18ccms_gmail_com
* @date 2018-11-24 下午2:54:02
* @version V1.0
*/
packagetop.yangxianyang.demo1;
/**
*
* 项目名称:Struts2day01
* 类名称:HelloAction
* 类描述:测试Strurs2
* 创建人:yangyangyang
* 创建时间:2018-11-24下午2:54:02
* 修改人:yangyangyang
* 修改时间:2018-11-24下午2:54:02
* 修改备注:
* @version
*
*/
public class HelloAction {
/**
* 提供一个方法:
* * 方法签名固定的
* 共有的 返回值是String类型方法名execute 在这个方法中不能传递参数。
*/
public String execute(){
System.out.println("HelloAction执行了...");
return null;
}
}
3.6对Action进行配置
l 在src下创建(提供)名称叫做struts.xml的配置文件
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//ApacheSoftware Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--Struts2为了管理Action的配置,通过包进行管理 -->
<!-- 配置Struts2的包 -->
<package name="demo1"namespace="/" extends="struts-default">
<!-- 配置Action -->
<action name="hello"class="top.yangxianyang.demo1.HelloAction">
</action>
</package>
</struts>
3.7配置前端控制器(核心过滤器web.xml中配置)
代码语言:javascript复制<!-- 配置Struts2的核心过滤器-->
<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>
3.8改写Action中的方法的返回值
代码语言:javascript复制/**
* 提供一个方法:
* * 方法签名固定的
* 共有的 返回值是String类型 方法名execute 在这个方法中不能传递参数。
*/
public Stringexecute(){
System.out.println("HelloAction执行了...");
return"success";
}
3.9改写struts.xml
代码语言:javascript复制<package name="demo1" namespace="/"extends="struts-default">
<!-- 配置Action -->
<action name="hello"class="top.yangxianyang.demo1.HelloAction">
<!-- 配置页面的跳转 -->
<result name="success">/demo1/success.jsp</result>
</action>
</package>
3.10编写success.jsp
代码语言:javascript复制<body>
<h1>跳转成功页面!!!</h1>
</body>
4.Struts2的执行流程
4.1Struts2的执行流程
当用户访问某一个Action的时候,先经过核心过滤器,在核心过滤器中执行一组拦截器(这组拦截器实现部分功能),执行目标Action,根据Action的返回值,进行页面跳转。
5.Struts2的常见配置
5.1配置XML的提示
5.2Struts2的配置文件的加载顺序(了解)
5.2.1Struts2的配置文件加载顺序
l init_DefaultProperties() ----加载default.properties l init_TraditionalXmlConfigurations(); ----加载struts-default.xml、struts-plugin.xml、struts.xml l init_LegacyStrutsProperties(); ----加载struts.properties l init_CustomConfigurationProviders(); ----加载配置提供类 l init_FilterInitParameters() ; // [6] ----加载web.xml中过滤器初始化参数 l init_AliasStandardObjects() ; // [7] ----加载Bean对象
5.2.2加载顺序
l default.properties l struts-default.xml l struts-plugin.xml l struts.xml l struts.properties l web.xml
n 注意:后配置的常量的值会覆盖先配置的常量的值。
5.3Action的配置
5.3.1package相关配置
l package标签称为包,这个包与Java中的包的概念不一致。包为了更好管理action的配置。
l package标签的属性
n name :包的名称,只要在一个项目中不重名即可。
n extends :继承哪个包,通常值为struts-default。
n namespace :名称空间,与<action>标签中的name属性共同决定访问路径。
u 名称空间有三种写法:
l 带名称的名称空间 :namespace=”/aaa”
l 根名称空间 :namespance=”/”
l 默认名称空间 :namespace=””
n abstract :抽象的,是否允许其他包继承。
5.3.2action相关配置
l action标签配置Action类。
l action标签的属性
n name :与namespace共同决定访问路径
n class :Action类的全路径
n method :执行Action中的哪个方法的方法名,默认值execute
n converter :用于设置类型转换器
5.4常量的配置
在Struts2的框架中,提供了非常多的常量:(在default.properties)
l struts.i18n.encoding=UTF-8 ----Struts2中所有的post请求的中文乱码不用处理。
l struts.action.extension=action,, ----Struts2请求的默认的扩展名。默认扩展名是.action或者什么都不写。
在Struts2中修改一些常量的值:
l 修改常量的值,可以有三个位置进行修正
n struts.xml中进行修改
代码语言:javascript复制<!-- 常量的修改 -->
<constant name="struts.action.extension"value="action"></constant>
n struts.properties中进行修改
struts.action.extension=action,,
n web.xml中进行修改
<!-- 配置Struts2的核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!-- 修改常量 -->
<!--<init-param>
<param-name>struts.action.extension</param-name>
<param-value>xyz</param-value>
</init-param>-->
</filter>
5.5分模块开发的配置
include的配置
代码语言:javascript复制<include file="com/itheima/struts/demo1/struts_demo1.xml"/>
<include file="com/itheima/struts/demo2/struts_demo2.xml"/>
<include file="com/itheima/struts/demo3/struts_demo3.xml"/>
6.Action的访问
6.1Action的写法
6.1.1Action类是POJO的类
代码语言:javascript复制package top.yangxianyang.demo2;
/**
* Action的编写方式:Action类是一个POJO的类
* @author yxy
*
*/
publicclass ActionDemo1 {
public Stringexecute(){
System.out.println("ActionDemo1执行了...");
returnnull;
}
}
6.1.2Action类实现一个Action的接口
代码语言:javascript复制package top.yangxianyang.demo2;
import com.opensymphony.xwork2.Action;
/**
* Action的编写方式二:实现一个Action的接口
* * 实现接口的这种方式:提供了五个常量(五个逻辑视图的名称)
* * SUCCESS :成功
* * ERROR :失败
* * LOGIN :登录出错页面跳转
* * INPUT :表单校验的时候出错
* * NONE :不跳转
* @author yxy
*
*/
publicclass ActionDemo2 implements Action{
@Override
public Stringexecute() throws Exception {
System.out.println("ActionDemo2执行了...");
returnNONE;
}
}
6.1.3Action类继承ActionSupport类
代码语言:javascript复制packagetop.yangxianyang.demo2;
import com.opensymphony.xwork2.ActionSupport;
/**
* Action的编写方式三:Action类继承ActionSupport类
* * 推荐使用继承ActionSupport方式
* * ActionSupport中提供了数据校验、国际化等一系列操作的方法。
* @author yxy
*
*/
publicclass ActionDemo3 extends ActionSupport{
@Override
public Stringexecute() throws Exception {
System.out.println("ActionDemo3执行了...");
returnNONE;
}
}
6.2Action的访问
6.2.1通过method设置
代码语言:javascript复制<!-- Struts2为了管理Action的配置,通过包进行管理。 -->
<!-- 配置Struts2的包 ================ -->
<package name="demo3"extends="struts-default" namespace="/">
<action name="userFind"class="top.yangxianyang.demo3.UserAction" method="find"></action>
<action name="userUpdate"class="top.yangxianyang.demo3.UserAction" method="update"></action>
<action name="userDelete"class="top.yangxianyang.demo3.UserAction" method="delete"></action>
<action name="userSave"class="top.yangxianyang.demo3.UserAction" method="save"></action>
6.2.2通过通配符的方式进行配置(*****)
代码语言:javascript复制<!-- 通配符的方式 -->
<action name="product_*"class="top.yangxianyang.demo3.ProductAction"method="{1}"></action>
6.2.3动态方法访问
代码语言:javascript复制<!-- 动态方法访问的方式 -->
<action name="customer"class="top.yangxianyang.demo3.CustomerAction"></action>
l 开启动态方法访问
<!-- 开启动态方法访问 -->
<constant name="struts.enable.DynamicMethodInvocation"value="true"/>
l 编写访问路径
<h3>通过动态方法访问的方式</h3>
<a href="${pageContext.request.contextPath }/customer!find.action">查询客户</a><br/>
<a href="${ pageContext.request.contextPath}/customer!update.action">修改客户</a><br/>
<a href="${pageContext.request.contextPath }/customer!delete.action">删除客户</a><br/>
<a href="${pageContext.request.contextPath }/customer!save.action">保存客户</a><br/>
源码地址:
链接: https://pan.baidu.com/s/1hyn9jUKba_Hw51a3RhLY1g提取码: wgug 复制这段内容后打开百度网盘手机App,操作更方便哦