前面我们已经把Struts2的运行环境搭建起来了,下面我们开始创建我们的第一个Action,还是按照Max的教程来,我新创建了如下几个文件:
sayHello.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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>Say Hello</title>
</head>
<body>
<h3>Say "Hello" to: </h3>
Address:<input type="text" name="address"/>
<s:form action="HelloWorld">
Name: <s:textfield name="name"/>
<s:submit></s:submit>
</s:form>
</body>
</html>
HelloWorld.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello</title>
</head>
<body>
<h3><s:property value="name" /></h3>
</body>
</html>
- HelloWorld.java
- 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+"!";
- //System.out.println(name);
- return SUCCESS;
- }
- }
这几个文件之间的流程如下图所示:
首先sayHello.jsp向服务器发送请求,然后根据我们web.xml文件的配置,这个请求被交给了FilterDispatcher这个类来进行处理,FilterDispatcher会根据我们struts.xml文件的中的配置信息来对这个请求分流,让它进入某个指定的action(本例中是HelloWorld.java),在处理完请求之后,再将页面转向HelloWorld.jsp(这个也是在struts.xml中指定的)。为了保证上述流程的顺利执行,现在struts.xml文件的内容修改如下:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- this is a test
<include file="struts-default.xml"></include> -->
<package name="tutorial" extends="struts-default">
<action name="HelloWorld" class="tutorial.HelloWorld">
<result>HelloWorld.jsp</result>
</action>
</package>
</struts>
注意,这里action的name属性和sayHello.jsp中的action属性的值是一样的,实际上在FilterDispatcher中就是根据这两个值对request进行分流的,具体过程如下:
1. 我们写出这个处理这个请求的url,本例是http://localhost:8888/Struts/HelloWorld,
2. 取出http://localhost:8888/Struts/之后的字符串得到了HelloWorld
3. 在struts.xml文件中查找name属性为HelloWorld的action,把request交给它处理,默认情况下首先执行它里面的execute()方法
4. 请求处理完毕之后进入HelloWorld.jsp页面,配置在<result>标签里面
当然上述流程是最简单的一个过程,还没有涉及到命名空间、请求处理完毕之后要根据执
行结果跳转到不同的页面等一些复杂的问题,后面我会把我的学习心得贴出来。
注:上述request的分流流程是我根据struts1里面的机制推测的,在struts1里面这个过程由ActionServlet负责,它会调用RequestProcessor里面的一个方法对访问路径进行处理,这个在我博客里面的《Struts工作流程》中可以找到,至于这个FilterDispatcher,因为看不到源码只能推测一下了,^_^。