Struts2架构
Struts2概述
以上文本来自百度百科
Struts2是一个基于VMC设计模式的web层架构
常见的web层框架
Struts2、Struts1、webwork、springMVC
web层框架都是基于前端控制器模型的
Struts2入门
下载Struts2开发环境
解压Struts2开发包
- apps :Struts2提供的应用,war文件:web项目打成war包。直接放入到tomcat可以运行。
- docs :Struts2的开发文档和API
- lib :Strtus2框架的开发的jar包
- src :Struts2的源码
创建web项目,导入jar包
struts-blank项目下找jar包
创建一个jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Struts2的入门</h1> <h3><a href="${ pageContext.request.contextPath }/hello.action">Struts2的入门</a></h3> </body> </html>
编写action类
public class HelloAction { /** * 提供一个方法: * * 方法签名固定的 * 共有的 返回值是String类型 方法名execute 在这个方法中不能传递参数。 */ public String execute(){ System.out.println("HelloAction执行了..."); return "success"; } }
对action进行配置 struts_demo1.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- Struts2为了管理Action的配置,通过包进行管理。 --> <!-- 配置Struts2的包 ================ --> <package name="demo1" extends="struts-default" namespace="/"> <!-- 配置Action================ --> <action name="hello" class="com.itheima.struts.demo1.HelloAction" > <!-- 配置页面的跳转=========== --> <result name="success">/demo1/success.jsp</result> </action> </package> </struts>
配置前端控制器(核心过滤器)
在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> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
编写前端success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>跳转成功页面!!!</h1> </body> </html>
Struts2执行流程
当用户访问某一个Action的时候,先经过核心过滤器,在核心过滤器中执行一组拦截器(这组拦截器实现部分功能),执行目标Action,根据Action的返回值,进行页面跳转
Struts2的配置文件的加载顺序*(了解)
Struts中可以在很多地方设置初始化常量,实际用到哪一个,这就与加载顺序有关了
init_DefaultProperties() ----加载default.properties
init_TraditionalXmlConfigurations(); ----加载struts-default.xml、struts-plugin.xml、struts.xml
init_LegacyStrutsProperties(); ----加载struts.properties
init_CustomConfigurationProviders(); ----加载配置提供类
init_FilterInitParameters() ; // [6] ----加载web.xml中过滤器初始化参数
init_AliasStandardObjects() ; // [7] ----加载Bean对象
加载顺序
default.properties
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
注意:后配置的常量的值会覆盖先配置的常量的值。
Action配置
package相关配置
- package标签称为包,这个包与Java中的包的概念不一致。包为了更好管理action的配置。
- package标签的属性
- name :包的名称,只有在一个项目中不重名即可。
- extends :继承哪个包,通常值为struts-default。
- namespace :名称空间,与<action>标签中的name属性共同决定访问路径。
- 名称空间有三种写法:
- 带名称的名称空间 :namespace=”/aaa”
- 跟名称空间 :namespance=”/”
- 默认名称空间 :namespace=””
- package标签称为包,这个包与Java中的包的概念不一致。包为了更好管理action的配置。
- package标签的属性
- name :包的名称,只有在一个项目中不重名即可。
- extends :继承哪个包,通常值为struts-default。
- namespace :名称空间,与<action>标签中的name属性共同决定访问路径。
- 名称空间有三种写法:
- 带名称的名称空间 :namespace=”/aaa”
- 跟名称空间 :namespance=”/”
- 默认名称空间 :namespace=””
- 名称空间有三种写法:
- abstract :抽象的,用于其他包的继承。要想让别的包继承,就要将abstract设置成true
- 名称空间有三种写法:
action相关配置
- action标签配置Action类。
- action标签的属性
- name :与namespace共同决定访问路径
- class :Action类的全路径
- method :执行Action中的哪个方法的方法名,默认值execute
- converter :用于设置类型转换器,比如将String转换成基本数据类型(int、double等)、时间日期类型的转换等
<package>中的 namespace 与 <action> 中的 name 共同构成访问路径
常量的配置
在Struts2的框架中,提供了非常多的常量:(在default.properties)
- struts.i18n.encoding=UTF-8 ----Struts2中所有的post请求的中文乱码不用处理。
- struts.action.extension=action,, ----Struts2请求的默认的扩展名。默认扩展名是.action或者什么都不写。
在Struts2中修改一些常量的值:
- 修改常量的值,可以有三个位置进行修正
- struts.xml中进行修改
- struts.properties中进行修改(这个配置文件是我们自己在src下创建的,用户可以自行修改的,只能修改常量)
- web.xml中进行修改
分模块开发的配置
include标签,在struts.xml中配置
action的访问
Action类的写法
Action类是POJO(Plain Ordinary Java Object 简单的java类型)类
/**
* Action的编写方式:Action类是一个POJO的类
*
*/
public class ActionDemo1 {
public String execute(){
System.out.println("ActionDemo1执行了...");
return null;
}
}
Action类实现Action接口
/**
* Action的编写方式二:实现一个Action的接口
* * 实现接口的这种方式:提供了五个常量(五个逻辑视图的名称)
* * SUCCESS :成功
* * ERROR :失败
* * LOGIN :登录出错页面跳转
* * INPUT :表单校验的时候出错
* * NONE :不跳转
*
*/
public class ActionDemo2 implements Action{
@Override
public String execute() throws Exception {
System.out.println("ActionDemo2执行了...");
return NONE;
}
}
Action类继承ActionSupport类(推荐使用这种,因为ActionSupport类实现了Action接口,同时增加了许多功能)
import com.opensymphony.xwork2.ActionSupport;
/**
* Action的编写方式三:Action类继承ActionSupport类
* * 推荐使用继承ActionSupport方式
* * ActionSupport中提供了数据校验、国际化等一系列操作的方法。
*
*/
public class ActionDemo3 extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("ActionDemo3执行了...");
return NONE;
}
}
Action的访问方法
但在实际开发中,我们一般是一个 模块 对应一个 类 ,一个 请求 对应类中的一个 方法
因此Struts2提供了三种访问的方法
通过method属性配置
前端代码
<h3>通过method方式</h3> <a href="${ pageContext.request.contextPath }/userFind.action">查询用户</a><br/> <a href="${ pageContext.request.contextPath }/userUpdate.action">修改用户</a><br/> <a href="${ pageContext.request.contextPath }/userDelete.action">删除用户</a><br/> <a href="${ pageContext.request.contextPath }/userSave.action">保存用户</a><br/>
配置Struts2的包
<package name="demo3" extends="struts-default" namespace="/"> <action name="userFind" class="com.itheima.struts.demo3.UserAction" method="find"></action> <action name="userUpdate" class="com.itheima.struts.demo3.UserAction" method="update"></action> <action name="userDelete" class="com.itheima.struts.demo3.UserAction" method="delete"></action> <action name="userSave" class="com.itheima.struts.demo3.UserAction" method="save"></action> </package>
这样子,不同的前端请求,就会访问到UserAction类中的不同的方法中去
通过通配符的方式设置
前端页面访问
<h3>通过通配符的方式</h3> <a href="${ pageContext.request.contextPath }/product_find.action">查询商品</a><br/> <a href="${ pageContext.request.contextPath }/product_update.action">修改商品</a><br/> <a href="${ pageContext.request.contextPath }/product_delete.action">删除商品</a><br/> <a href="${ pageContext.request.contextPath }/product_save.action">保存商品</a><br/>
Struts2的包配置
<package name="demo3" extends="struts-default" namespace="/"> <!-- 通配符的方式 --> <action name="product_*" class="com.itheima.struts.demo3.ProductAction" method="{1}"></action> </package>
动态方法访问(Struts2中默认是关闭的)
配置Struts2的包
<package name="demo3" extends="struts-default" namespace="/"> <!-- 动态方法访问的方式 --> <action name="customer" class="com.itheima.struts.demo3.CustomerAction"></action> </package>
由于动态访问在Struts2中默认是关闭的,因此我们需要设置一下动态访问的常量,在struts.xml或其子配置文件中(如struts_demo3.xml)配置
<!-- 开启动态方法访问 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
编写动态访问路径,路径为 acting标签中配置的name + ! + 要访问的方法名 .action
<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/>