1. 框架的意义
所谓框架就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多经历放到业务需求的分析和理解上面。特点:封装了很多细节,使程序员在使用的时候会非常简单。
2. Struts2概述
Struts2是Apache发行的mvc开源框架,是表现层框架。是Apache和openSymphony组织合并开发出来的,里面包含了WebWork2的核心和struts的一些特性和功能,除此之外和struts1没有任何关系。
3. Struts2搭建环境
① 下载Struts2开发包
② 导入所需jar包到项目中
找到开发包自带的例子中,struts-blank的war包,在它的\WEB-INF\lib目录下的所有jar包就是使用struts2必须要的jar包,目录如下:
③ 创建struts2的配置文件
在src路径下建立一个默认名称为struts.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> </struts> |
④ 配置控制器
配置位置:在web.xml中,配置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> |
⑤ 验证是否成功,启动tomcat,不报错表示搭建成功
4. Struts2的入门案列
① 搭建环境
② 建立一个jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>struts2入门案例</title> </head> <body> <%--在web.xml配置的核心控制器的匹配的路径是/*,访问动作类的路径扩展名是默认的.action,也可以不加扩展名 --%> <a href="${pageContext.request.contextPath}/hello">访问helloAction</a> <br> <a href="${pageContext.request.contextPath}/hello.action">同样访问helloAction</a> </body> </html> |
③ 在struts.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> <package name="p1" extends="struts-default"> <action name="hello" class="com.mangocity.web.action.HelloAction" method="hello"> <result name="success">/success.jsp</result> </action> </package> </struts> |
④ 建立动作类和动作方法
public class HelloAction { public String hello(){ System.out.println("hello,这是struts2的入门案例!"); return "success"; } } |
⑤ 结果试图页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Struts2入门案例-执行结果试图</title> </head> <body> 执行成功 <br> </body> </html> |
拓展:需求要配置shtml作为访问动作类的扩展名。
在struts.xml中配置访问动作类的扩展名:
<constant name="struts.action.extension" value="shtml" /> |
5. Struts2的配置文件
① 加载时机:当应用被tomcat加载的时候,struts2的配置文件就已经被加载过了
② 加载顺序,struts2jar包中及我们的项目中的配置文件有6个,其中加载顺序为:
顺序 | 配置文件名 | 所在位置 | 说明 |
1 | default.properties | struts2-core-2.3.15.3.jar\org\apache\struts2 | 不能修改 |
2 | struts-default.xml | struts2-core-2.3.15.3.jar | 不能修改 |
3 | strtuts-plugin.xml | 在struts2提供的插件jar包中 | 不能修改 |
4 | struts.xml | 我们的应用中 | 我们修改的:推荐 |
5 | struts.properties | 我们的应用中 | 我们修改的 |
6 | web.xml | 我们的应用中 | 我们修改的,可以给过滤器配置参数 |
注意:struts2中提供了两种配置的方式:properties和xml.当多个配置文件中有相同的参数,后加载的值会把前面加载的值给覆盖掉。
6. Struts2框架提供的常量
① 常用的常量
常量定义在了default.properties配置文件中,所有的strtuts2应用都会用到这些常量。
常用的常量:
常量名 | 常量值 | 说明 |
struts.i18n.encoding | UTF-8 | 应用中使用的编码 |
struts.objectFactory.spring.autoWire | name | 和spring框架整合有关 |
struts.multipart.parser | jakarta | 指定文件上传用的组件 |
struts.multipart.maxSize | 2097152 | 文件上传总文件大小限制:2M |
struts.action.extension | action,, | 能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔 |
struts.enable.DynamicMethodInvocation | false | 是否允许动态方法调用 |
struts.devMode | false | 是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true。 |
struts.ui.theme | xhtml | 页面展示用的主题 |
② 在struts.xml中覆盖常量
使用<constant name=”” value=””></constant>元素进行覆盖,例:
把扩展名改成以.shtml结尾 <constant name="struts.action.extension" value="shtml" /> |
③ 创建struts.properties文件覆盖
例:
#设置为开发模式 struts.devModel=true #设置请求资源URI扩展名 struts.action.extension=shtml |
④ 在web.xml中配置过滤器参数
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>struts.devModel</param-name> <param-value>true</param-value> </init-param> </filter> |
7. Xml配置文件的主要元素
7.1 package元素
7.1.1作用:在struts2的配置文件中引入了面向对象思想,使用了分包管理,易于管理动作类,便于模块化开发动作类
7.1.2属性:
name:包的名称,必须写且唯一
extends:一般情况下需要继承struts-default包,但不是必须的,但如果不继承,将无法使用struts2提供的核心功能
abstract:把包声明为抽象包,抽象包是用来继承的,只要是没有<action>元素的包就可以声明为抽象包
namespace:名称空间。名称空间+动作名称 =访问路径
7.1.3动作类的搜索顺序:
Namespace的默认值:a.不写改属性 b.该属性=”” 注意默认值不是”/”
7.2 action元素
7.2.1作用:配置动作类
7.2.2属性
name:动作类名称
class:动作类全路径,默认的动作类是:com.opensymphony.xwork2.ActionSupport,如果要替换默认的动作类,可以在package标签中加入:
<default-class-ref class="类全路径"/> |
Method:动作类中的方法名称,默认是:public String execute(){}
7.3 result元素
7.3.1作用:为动作指定结果试图
7.3.2属性
Name:逻辑视图的名称,对应动作类的返回值,默认是SUCCESS
Type:结果类型,指的是用什么方式跳转到定义的页面。默认是dispatcher
常用结果类型:
dispatcher:请求转发
redirect:重定向
redirectAction:重定向到另一个动作类
a. 重定向到另一个相同名称空间的动作
<result name=”success” type=”redirectAction”>action2<result> |
b. 重定向到不同名称空间的动作
<result name=”success” type=”redirectAction”> <param name=”namespace”>/n2</param> <param name=”actionName”>action2</param> </result> |
chain:请求转发到另一个动作类
a. 请求转发到另一个相同名称空间的动作
<result name=”success” type=”chain”>action2<result> |
b. 请求转发到不同名称空间的动作
<result name=”success” type=”chain”> <param name=”namespace”>/n2</param> <param name=”actionName”>action2</param> </result> |
7.3.3result元素中param子元素
在转发或者重定向到不同包下的动作时,都用到了param子元素
Param元素的作用:依赖注入(Dependence Injection)思想
8. 创建动作类的三种方式
方式一:创建一个普通的java类
方式二:动作类实现Action接口,Action接口中定义的一些常量:
常量变量名 | 对应的值 | 说明 |
SUCCESS | success | 动作方法执行一切OK |
ERROR | error | 动作方法执行时遇到了异常 |
INPUT | input | 回显 |
LOGIN | login | 一般转向登陆页面 |
NONE | none | 不转向任何的视图 |
方式三:动作类继承ActionSupport类
9. 动作类的访问
9.1 使用通配符
普通版:
<action name="*" class="com.mangocity.web.action.UserAction" method="{1}"> <result name="success">/{1}.jsp</result> </action> |
升级版:
<action name="*_*" class="com.mangocity.web.action.{1}Action" method="{2}"> <result name="success">/success.jsp</result> </action> |
9.2 动态方法调用
9.2.1在struts.xml中配置允许动态方法调用
<constant name="struts.enable.DynamicMethodInvocation" value="true"/> <package name="hello" extends="struts-default" namespace="/hello"> <action name="hello" class="com.mangocity.web.action.HelloAction"> <result name="success">/success.jsp</result> </action> </package> |
9.2.2动态方法调用:动作名称!动作方法名称
10. 自定义结果类型
结果类型就是一个类,这些类都实现了com.opensymphony.xwork2.Result接口或者继承自该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport,这些类都有一个doExecute方法,用于执行结果试图。
示例:创建验证码结果试图:
第一步:创建验证码结果类型类
public class CaptchaResult extends StrutsResultSupport { @Override protected void doExecute(String arg0, ActionInvocation arg1) throws Exception { ValidateCode code=new ValidateCode(200,100,4,10); HttpServletResponse response=ServletActionContext.getResponse(); code.write(response.getOutputStream()); } } |
第二步:在struts.xml中配置
<package name="p1" extends="struts-default"> <result-types> <result-type name="captcha" class="com.mangocity.web.result.CaptchaResult"></result-type> </result-types> <action name="captchaAction"> <result type="captcha"></result> </action> |
11. 配置全局视图
结果视图的查找顺序:先找局部的结果视图,没有再找全局结果视图
<package name="myDefault" extends="struts-default" abstract="true"> <result-types> <result-type name="captcha" class="com.mangocity.web.result.CaptchaResult"></result-type> </result-types> <global-results> <result name="success" type="captcha"></result> </global-results> </package> <package name="p1" extends="myDefault"> <action name="captchaAction"></action> |
12. 在动作类中访问Servlet的API
第一种方式:使用ServletActionContext类
HttpServletRequest request=ServletActionContext.getRequest(); HttpServletResponse response=ServletActionContext.getResponse(); |
第二种方法:使用实现接口的方式,实现ServletRequestAware,ServletResponseAware
public class Demo2Action implements ServletRequestAware,ServletResponseAware {
private HttpServletResponse response; private HttpServletRequest request; public void setServletResponse(HttpServletResponse response) { this.response=response; }
public void setServletRequest(HttpServletRequest request) { this.request=request; }
public String add(){ System.out.println(request); System.out.println(response); return "success"; } } |