struts2入门简介
struts2的工作模式
1.浏览器发送请求
2.核心控制器FilterDispatcher拦截请求,并根据mapping调用合适的action
3.返回合适的页面给用户
首先要在web.xml中选择设置struts2组件做为filter,即使用AOP的过滤方式来调用struts组件。
<web-appid="WebApp_9"version="2.4"xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts Blank</display-name>
<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>
<welcome-file-list>
<welcome-file>sayHello.jsp</welcome-file>
</welcome-file-list>
</web-app>
注意到这里使用的的是2.1.3版本的新过滤器,参见FilterDispatcher和StrutsPrepareAndExecuteFilter的区别
加载完成struts组件后,
其次要建立一个Action类,之后通过mapping的方式来调用这个Action
package tutorial;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorld extends ActionSupport {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String execute() {
name = "Hello, " + name + "!";
return SUCCESS;
}
}
如何调用Action是要通过struts的配置文件来确定的,struts配置文件也是一个xml,默认名为struts.xml,默认位置是代码根目录,之后也会介绍通过一些方法把这个xml放到自己想放的位置,
首先演示一个稍复杂点的struts.xml的结构,然后再演示和上文配套的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>
<constant name="struts.custom.i18n.resources" value="mess"></constant>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<constant name="struts.multipart.maxSize" value="500000000000"></constant>
<include file="user.xml"/>
<!-- <package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
<action name="index">
<result type="redirectAction">
<param name="actionName">HelloWorld</param>
<param name="namespace">/example</param>
</result>
</action>
</package>
<include file="example.xml"/>-->
<!-- Add packages here -->
</struts>
constant是些默认参数的设置,相关action的配置通过include的方法,把配置文件分离
下面是include的user.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="user" namespace="/user" extends="struts-default">
<action name="addUserAction" class="com.user.controller.UserAction" method="addUser">
<result name="success">/common/success.jsp</result>
<result name="error">/common/error.jsp</result>
</action>
<action name="queryUserAction" class="com.user.controller.UserAction" method="queryUser">
<result name="success">/user/query.jsp</result>
<result name="error">/common/error.jsp</result>
</action>
<action name="deleteUserAction" class="com.user.controller.UserAction" method="deleteUser">
<result name="success">/user/query.jsp</result>
<result name="error">/common/error.jsp</result>
</action>
<action name="updateUserAction" class="com.user.controller.UserAction" method="updateUser">
<result name="success">/user/update.jsp</result>
<result name="error">/common/error.jsp</result>
</action>
</package>
</struts>
对于以上的user.xml,我们这里可以看到有几个注意点
首先在结构上structs的xml由一个(或几个)package节点所包围,
这个package节点有几个属性,
name属性:包名,主要用于继承问题,如果在后面的extends里写了其他包的name,就继承了这个包,就等于有了这个包里的所有action和filter
namespace:命名空间,这个是为了解决重名问题,和类的命名空间是一个意义,记得要带/
extends:之前name属性已经介绍了,写要继承的包名,如果不继承谁,记得写struts-default,这个struts自带的包有很多拦截器,是完成struts本身功能的一些内置功能,所以不要忘记写
然后包含若干个action节点
name:action名
class:对应的action class的全路径
method:此action绑定到的这个class中的哪个方法
而result则表示如果返回的是相应的值时,action会被重定为到什么位置
以下回到与上文相关的struts.xml示例
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-default.xml"/>
<package name="tutorial" extends="struts-default">
<action name="HelloWorld" class="tutorial.HelloWorld">
<result>HelloWorld.jsp</result>
</action>
</package>
</struts>
注意到这是个简单版的struts.xml,标签意义在上一个版本中已经有所解释
最后再来看一下两个页面
SayHello.jsp:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Say Hello</title>
</head>
<body>
<h3>Say "Hello" to: </h3>
<s:form action="HelloWorld">
Name: <s:textfield name="name" />
<s:submit />
</s:form>
</body>
</html>
HelloWorld.jsp:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Hello</title>
</head>
<body>
<h3><s:property value="name" /></h3>
</body>
</html>
最后,重新梳理下本实例的struts流程:
1.首先欢迎页面是sayHello.jsp,通过web.xml中的welcome-file-list来确定,
2.进入sayHello.jsp后,提交表单时,filter会调用struts主解析类,进一步解析struts标签,发现action关联名HelloWorld,以及textfield的变量定位为name,通过struts.xml的mapping列表定位到具体类tutorial.HelloWorld,在遍历类后绑定textfield的name变量到同名类变量。
3.提交表单意味着同名变量被赋值,赋值完成后,因为没有指定绑定到哪一个具体的函数,即form的action缺少method属性,所以默认调用excute函数,
4.调用完成后,从struts.xml里找到HelloWorld的result,获知结果将重定为到HelloWorld.jsp,在现实HelloWorld.jsp的同时,发现有绑定项name,于是从action中获取name字段并赋值给相应字段,并显示页面
路径要点
tsp -> struts filterDispatcher -> action -> result(jsp)