一、MVC思想特点
(1)、多个视图对应一个模型
(2)、模型返回的数据与显示视图分离
(3)、应用分三层,减低了各层之间的耦合、提供了应用的可扩展性
(4)、控制层将不同的模型和不同的视图组合在一起,完成不同的请求
(5)、MVC更符合软件工程化管理的精神
二、web.xml配置文件中配置struts2的核心Filter
代码片段:
<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>
三、案例1
(loginDemo:)
loginAction:
public class LoginAcrion extends ActionSupport {
private static final long serialVersionUID = 1L;
private String name;
private String pass;
public void setPass(String pass) {
this.pass = pass;
}
public String getPass() {
return pass;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
if(name.equals("zhangsan") && pass.equals("123")){
return SUCCESS;
}
return ERROR;
}
welcome.jsp
<body>
<s:debug></s:debug>
<s:form action="Login" method="post">
<s:textfield label="姓名" name="name"></s:textfield>
<s:password label="密码" name="pass"></s:password>
<s:submit value="登陆"></s:submit>
</s:form>
</body>
success.jsp
<body>
<s:debug/>
恭喜您: <s:property value="name"/>
登陆成功
</body>
error.jsp
<body>
出错啦~
</body>
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>
<package name="struts" extends="struts-default">
<action name="Login" class="com.struts.action.LoginAcrion">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
四、struts2应用的开发步骤
(1)、在web.xml中定义核心的Filter来拦截用户请求<见第二点>
(2)、如果需要一post方法提交请求,则需定义包含表单数据的jsp页面。如果只是以GET方法发送请求,则无须这一步
(3)、定义处理用户请求的action类
(4)、配置action<见第三点 struts.xml>
(5)、配置处理结果与物理视图资源之间的对应关系<见第三点 struts.xml>
(6)、编辑视图资源
五、struts2常用标签
(1)头文件:
<%@ taglib prefix="s" uri="/struts-tags"%> (s开头)
<%@ taglib prefix="sx"uri="/struts-dojo-tags"%> (sx开头)
(2)常用标签:《详细见struts2标签详解》
标签名 示例 效果
<a>超链接 a <s:a href="Register.action">注册</s:a> 形成超链接
<d>日期标签 datetimepicker: <sx:datetimepicker name="time" label="日期"></sx:datetimepicker> 在页面显示一个可下拉的日期控件
六、配置文件详解
package节点详解
基本属性
1. name
name属性为每个package设置一个唯一的标识,这个标识在所有的package定义中不能重复。
2. abstract
标识这个package的定义是一个抽象定义,也就是允许他仅包含声明式的定义,而不需要在package定义中包含action的定义。
3. extends
通过使用extends,你可以指定本package继承另外一个package的所有的配置。当某个package继承了另外一个package的所有配置,那么你就无需对父package中已经声明过的配置定义做再次的定义。
同时,如果重复定义父package中已声明过的配置定义,那么这些重复定义声明将覆盖父package中的相关定义。
4. namespace
这段来自Struts2的Reference的引用,基本上阐明了namespace的作用:对于action配置进行逻辑划分。
如果我们不为package节点指定namespace,Struts2默认使用一个空字符串作为默认的namespace。当然,也可以使用"/"等字符串来表示namespace。
Struts2在根据URL进行寻址的时候,使用以下的步骤:
1) 根据URL进行Namespace和ActionName的计算
2) 根据计算的得到的Namespace和ActionName查找package节点中相应配置
3) 如果查找失败,则查找Namespace为空,ActionName为整个URL的配置
有关上述3点的详细信息,请参考Struts2的Reference: http://struts.apache.org/2.0.14/docs/namespace-configuration.html
result-types节点
在result-types节点中,我们可以声明在本package中所支持的Result类型。这些Result类型,将在action节点中被引用到。
dispatcher 用来转向页面,通常处理JSP
freemarker 处理FreeMarker模板
tttpheader 用来控制特殊的Http行为
redirect 重定向到一个URL
redirectAction 重定向到一个Action
stream 向浏览器发送InputSream对象,通常用来处理文件下载
velocity 处理Velocity模板
xslt 处理XML/XLST模板
plainText 显示原始文件内容,例如文件源代码
interceptors节点
在interceptors节点中有两类节点:<interceptor>和<interceptor-stack>。这两个节点都用于声明拦截器。前者的作用,是真正定义一个拦截器。而后者则通过引用已经定义的拦截器,指定他们的执行顺序。
当我们在试图在Action中引用拦截器时,我们实际上是为某个Action指定需要执行哪些拦截器,并且为这些拦截器指定执行顺序。所以Action所引用的,是某个<interceptor-stack>中的定义。
缺省配置指向
为了简化配置,我们可以在package节点中指定本package内的缺省配置指向。这可以通过<default-interceptor-ref>、<default-action-ref>、<global-results>等子节点来完成。
action节点
action节点是所有的Runtime配置的核心内容。它的主要作用就是指定URL与Action之间的映射关系。同时,在action节点中你也可以指定action执行时的相关配置,例如action所引用的interceptor等。
使用include节点
plugin中的配置文件,实际上是位于classpath的JAR包中的,那么我们在项目中,如何对一个庞大的配置文件进行拆分呢?在Struts2中,可以使用include节点对所有的Struts2配置文件进行拆分和模块化管理。例如:
- <struts>
- <include file="struts-default.xml"/>
- <include file="web/struts-config.xml"/>
- <include file="web/struts-action.xml"/>
- </struts>
其中,file所指定的文件是相对于classpath的相对目录中的文件。而每个配置文件的格式与struts-default.xml的格式也是相同的。
通过include节点,我们就可以对一个比较大的配置文件按照功能和模块进行拆分,这在一个大型的团队开发中,是相当有意义的。