简单介绍
Struts2与struts1相比,是一个全新的MVC框架。
FilterDispatcher,将接收所有请求,并根据ActionMapper(请参考:docs\actionmapper.html)所提供的信息,决定Action是否应该被调用或哪些方法将被调用(如判断其URL扩展名是否符合要求,URL是否符合某些特定的语法规则(如foo!bar.action将调用foo类的bar方法)等,请参考相关的文档),当然,对于ActionMapper而言,由于它的判断需要依赖于struts2的配置,所以,它也要用到ConfigurationManager来获得配置信息。
接下来,针对每个Action类,将创建ActionProxy对象,它的创建依赖于ConfigurationManager(即配置文件)。
接下来执行ActionProxy对象的execute方法,如果给Action配置了一系列拦截器,那么这个Action的代理类将逐个执行这些拦截器。
当ActionProxy调用Action的方法,执行完之后,它将获得相关的Result对象,并调用Result.的execute方法来产生response对象。
包依赖
基础包:
1 commons-logging-1.1.jar
2 freemarker-2.3.8.jar
3 ognl-2.6.11.jar
4 struts2-core-2.0.8.jar
5 xwork-2.0.3.jar
6、 commons-fileupload-1.2.1.jar
7、commons-io-1.3.2.jar
入门级例子
1. 首先拷贝需要的基础依赖包(去除重复的jar包,保留高版本的)
2. 在web.xml中,配置FilterDispatcher过滤器
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter>
<filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
3、编写一个简单的Action类,这个类简单到不能再简单了!
public class VerySimpleAction { public String hello(){ return "success"; } } |
在struts2中,Action类不必一定要继承一个父类(虽然也可以这样做,你可以继承ActionSupport类)。当然,你需要返回一个String类型的值,这个值代表的意思是,你的下一步要到哪里去。
4、在类路径下,添加struts.xml配置文件,这个配置文件,是对Action的配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <package name="simple" namespace="/simple" extends="struts-default"> <action name="hello" class="com.bjsxt.crm.web.struts2.test.VerySimpleAction" method="hello" > <result name="success">/struts2/test/index.jsp</result> </action> </package> </struts> |
5、在相应位置提供JSP文件
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>世界你好</title> </head> <body> 世界你好 </body> </html> |
6、打开IE浏览器,在地址栏输入:
http://localhost:[端口]/[Context Path]/simple/hello.action |
至此,第一个struts2程序完成了。下面,是关于这个程序的问题的解答,以及进一步的讨论:
为什么需要输入.action结尾的URL地址?而不是.do?
Struts2在默认情况下,会将.action结尾的请求进行处理。我们可以在struts.xml配置文件中,指定可以使用的扩展名:
比如:
上述配置文件改为如下所示:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <constant name="struts.action.extension" value="action,do,webwork" /> <package name="simple" namespace="/simple" extends="struts-default"> <action name="hello" class="com.bjsxt.crm.web.struts2.test.VerySimpleAction" method="hello" > <result name="success">/struts2/test/index.jsp</result> </action> </package> </struts> |
这将使得struts2,对于所有以.action或.do或.webwork扩展名结尾的请求均进行处理!当然,它也可以在web.xml中或其它地方进行配置,struts2提供了非常灵活的方式,请【参考相应的文档(docs\constant-configuration.html)】或参考struts2-core-2.0.8.jar\org\apache\struts2下面的default.properties文件(这个文件在struts的核心jar包中)。
Struts2都有哪些配置文件?
Struts.xml是主要的配置文件,当然通过include标签可以将它拆分。比如,在struts.xml加入:
<include file="example.xml"/> |
即可添加一个example.xml文件,这个文件的配置与struts.xml文件的配置一致。往往大型应用中会按模块来划分配置文件。
另外还可以配置一些配置文件,请【参考docs\configuration-files.html】
通过使用annotation(JDK5的新特性),也可以完全取消这些配置文件。达到零配置文件的目的。也请参考相关的文档说明。
Struts2配置
【请参考:docs\configuration-elements.html】
相关概念:
Package:用来组织Action及其一系列配置的方式
Namespace: 页面访问的起始路径
Action:处理请求
Result: 结果转向
拦截器:将要使用哪些拦截器
Include: 可以将文件进行拆分,即通过include标签将一个配置文件包含进另外一个配置文件中
Struts2 的Action类?
Struts2的ACTION类可以是普通的POJO对象。方法只要返回字符串类型即可。这些字符串,代表了下一步的转向。这些Action类,每次请求都会创建一个新的对象。
Struts2的Action返回参数(result)?
用一个字符串代表result,然后可以定义一个视图(比如某个JSP页面),与之匹配。
定义在<action/>标签内部的result是局部result,也可以定义全局result:
<global-results> <result name="login" type="redirect">/Login.action</result> <result name="Exception">/Exception.jsp</result> </global-results>
|
默认的result是JSP视图,我们可以通过指定result的类型来指定其使用不同的视图技术,如:
<result type="freemarker">/struts2/test/freemarker.ftl</result> |
另外还有各种result类型。
【请参考:docs\result-types.html】
如何从浏览器向ACTION传递参数?
在Action类中定义属性,并提供getters/setters方法即可。
如何将参数从action传递到JSP?
在JSP中,使用:
<%@ taglib prefix="s" uri="/struts-tags"%>
引入struts2的taglib
调用:<s:propertyvalue="strvalue" />这样的标签,可以把值,从Action的属性中取出。
或者使用ActionContext.getContext().put()方法来传值。
或通过ServletActionContext.getRequest()/getSession()等方法往request/session中传值,在页面上可以通过:
<s:property value="#session.mySessionPropKey"/> or <s:property value="#session[‘mySessionPropKey’]"/> or <s:property value="#request[‘myRequestPropKey’]/> |
这样的方式来取值,【请参考:docs\ognl.html】
传递参数的内部机制是什么?(ValueStack)
概述
当请求到达ActionProxy进行处理之前,它会将界面传递过来的参数,经过转换之后,设置到Action对象中。 这种转换是通过OGNL进行的。
OGNL(Object Graph Navigation Language)是一种强大的对象导航语言,通过OGNL可以用一种非常简易的方式来给对象设值或从对象取值。而Struts2正是依赖于OGNL的这种设值和取值机制,来将页面数据转换为相应的类型并设置到Action对象中;或者从页面中读取数据的。
Struts2的OgnlValueStack,正是对Ognl的封装。ValueStack中会包含有当前环境中的各种对象信息。我们也可以通过调用ActionContext.getContext().put()方法,来往这个ValueStack中添加对象。
Struts2会将这个ValueStack放入request scope中,并取值为:struts.valueStack
OGNL
1. context
context是一个Map结构,可以自定义变量,并在ognl中的表达式中引用。使用#开头来引用这些变量
2. root
根对象,对于根对象,无需使用#开头来访问其属性值
根据实际例子来讲解OGNL的使用
ValueStack
与Spring如何集成?
1. 将struts2-spring-plugin-2.0.8.jar加入类路径
2. 在配置文件中,添加属性:
<constant name="struts.objectFactory" value="spring"/> |
3、即可以在spring中定义Action类,同时把struts2的配置文件中的class属性改为spring配置中的id值即可
如何处理异常?
通过类似如下配置可以定义出现一个异常的时候,应该转向什么页面来呈现:
<global-results> <result name="SystemException">/struts2/test/exception.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="SystemException" exception="com.bjsxt.crm.manager.SystemException"></exception-mapping> </global-exception-mappings> |
当出现SystemException异常之后,将转向exception.jsp页面,在exception.jsp页面上,可以这样写:
这是异常信息页面!【<s:property value="exception.message"/>】 |
从上面简单的例子知道,exception对象本身被添加到了ValueStack中!
【请参考:docs\exception-configuration.html】
Struts2标签库
主题,模板,标签
主题是模板的集合
默认情况下,使用在template目录下的xhtml(主题名称)目录内的tag标签(这些模板是freemarker编写的模板文件)
在不改动任何配置的前提下,我们可以在类路径中添加template目录,并且把xhtml目录拷贝到template目录下,这样,我们可以随意修改这些模板文件,直到符合我们的需要。Struts2将自动使用这些标签模板文件。
【请参考:docs\themes-and-templates.html】
### Standard UI theme
### Change this toreflect which path should be used for JSP control tag templates by default
struts.ui.theme=xhtml
struts.ui.templateDir=template
#sets the defaulttemplate type. Either ftl, vm, or jsp
struts.ui.templateSuffix=ftl
受控目录
在项目webroot下面,以struts开头的路径(struts*),是受到struts2控制的,你无法通过页面直接访问放到这些目录下面的JSP页面(但是在后台配置result的时候,可以使用)。
如:
/struts/test/index.jsp
/struts/index.jsp
/struts2/index.jsp
/struts222/index.jsp
…..
这些JSP,如果你通过在IE浏览器直接键入JSP的路径来访问的话,将提示无法访问