STRUTS2学习(一)——入门程序及基本流程
1、摘要
主要讲述了Struts2的相关入门知识及客户端向web容器发出请求后在服务器端处理用户请求的大概流程。本文的开发环境为MyEclipse-10.7.1+tomcat-7.0.68+jdk1.8.0-77+struts-2.2.1。本人菜鸟一枚,刚刚开始学习struts2,本文如有错误,希望大家能够指出,并谅解!
2、项目结构及代码
整个项目的结构如下图所示:
其中struts.xml文件内容为:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.devMode" value="true" ></constant>
<package name="user" namespace="/User" extends="struts-default">
<action name="Login">
<result>/login.jsp</result>
</action>
<action name="Welcome" class="action.WelcomeUserAction">
<result name="SUCCESS">/welcome_user.jsp</result>
</action>
</package>
</struts>
web.xml文件内容为:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<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>
</web-app>
action.WelcomeUserAction文件内容为:
package action;
public class WelcomeUserAction
{
private String username;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
// all struts logic here
public String execute()
{
return "SUCCESS";
}
}
login.jsp内容为:
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head></head>
<body>
<h1>Struts 2 Hello World Example</h1>
<s:form action="Welcome">
<s:textfield name="用户名" label="Username" />
<s:password name="密码" label="Password" />
<s:submit />
</s:form>
</body>
</html>
welcome_use.jsp内容为:
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head></head>
<body>
<h1>Struts 2 Hello World 示例</h1>
<h2>
Hello
<s:property value="username" />
</h2>
</body>
</html>
注:以上程序引用自http://www.yiibai.com/struts_2/struts-2-hello-world-example.html,由Wallen Heng翻译整理。
3、几点个人的思考
3.1、客户端浏览器发出HttpRequest(GET /struts2/User/Login.action)之后,都发生了什么?
这个请求最初当然是被tomcat捕捉到,他发现客户端发出的请求是指向struts2这个webapp的,于是他在webapp文件夹下(默认配置下)读取struts2文件夹下的web.xml的相关配置,在配置中读到了有一个名叫struts2的Filter(具体Filter的作用请参考:http://www.runoob.com/servlet/servlet-writing-filters.html),实现类是StrutsPrepareAndExecuteFilter。我们查看StrutsPrepareAndExecuteFilter的源码,可以看到其实现了Filter接口,尤其是实现了Filter下的doFilter方法:
public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter
{
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain);
}
doFilter方法会根据struts.xml中的配置查找相应的命名空间(上面的例子中找到的是命名空间User),而名称空间之后的url中紧跟的是相应的action(上面的例子中为Login)。在查到相应的action之后,struts将相应的结果页面(上面的例子中为login.jsp)交还给tomcat,最终解析成为html文档之后发还给客户端,在客户端的浏览器上解释展现。
3.2、Struts2作为一个二道贩子存在的意义在哪里?
可以看到,Struts在整个服务器反馈给客户端html的过程当中充当的是一个二道贩子的角色:他不像tomcat一样参与动态页面的计算,反而在jsp页面和web容器中间扮演了一个二传手的角色,将用户的请求和服务器最终展现给用户的界面(更官方的说法是视图View)分离开来,提供更加良好的扩展性,为复杂工程的开发提供便利。这也是Struts框架的最基本的目的。
注:以上理解来自于尚学堂马士兵老师的教学视频:http://v.youku.com/v_show/id_XMjU5NTYzNjM2.html?from=s1.8-1-1.2