- 从本质上来讲只要存在MVC设计,那么就一定会存在JSP和Servlet,但是这个时候JSP中可以使用Struts2.x提供的开发标签.同时对于Servlet,也是进行了一个重新定义,使用Action.
开发一个Echo程序.
- Struts2.x本身就属于一个WeB项目,所以首先要建立一个FirstStruts2Project.
- 选择next,选择创建web.xml文件
- 几乎所有的前端开发框架.都是需要有web.xml文件的.
- 创建完成之后项目的基本结构,但此时还缺少Struts2的开发包,以及Struts2.xml文件,如果使用的是myEclipse的话会更加的简单,如果不是则需要手动配置
- Struts2.x是一组开发*.jar包,所以理论上需要将开发包保存在WEB-INF/lib中
- 将下载好的struts2压缩包中的struts-2.3.37\apps目录下找到struts2-blank.war\WEB-INF\lib中的所有jar包
- 讲这些jar包全都复制到Eclipse创建好的项目中去
- xwork命名的文件都是当年webwork的身影
- 修改Eclipse中创建项目中的web.xml文件
- 添加以下内容
<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.xml文件
- 也可以直接将整个web.xml文件替换Eclipse中的web.xml文件
- 除了开发包和web.xml文件之外,还需要有struts2.xml文件的支持,拷贝 struts-2.3.37\apps\struts2-blank\WEB-INF\src\java 下的所有文件
- 将这些文件复制到Eclipse项目中的src中
- 将struts-2.3.37\apps\struts2-blank\WEB-INF\jsp 目录下的example文件夹复制到Eclipse项目中的WebContent中
观察web.xml文件
-
可以发现Struts2.x中处理用户请求的是过滤器,之所以使用过滤器原因有:
- 过滤器可以像普通Servlet那样处理所有的请求,也可以使用RequestDispatcher实现跳转.
- 因为Struts1x使用的是Servlet处理请求,所以Struts2.x为了不同,使用filter(登录检测麻烦).
-
编写一个Action程序
- 所有的Action程序都要继承自ActionSupport类.
package mao.shu.action;
import com.opensymphony.xwork2.ActionSupport;
public class EchoAction extends ActionSupport {
private String msg ;//假设请求传递的参数名称为"msg
public String getMsg(){
return this.msg;
}
public void setMsg(String msg){//代替了reques.getParameter()方法的操作
this.msg = msg;
}
@Override
public String execute() throws Exception {
this.msg = "ECHO:"+msg;
return "echo.page";//返回映射路径名称
}
}
-
整个代码中可以发现,没有发现request的身影,直接利用setter方法可以实现参数的传递
-
如果想要将内容传递回jsp,也不用关心request属性范围
-
在src/struts.xml文件中配置此Action
<package name="root" namespace="/" extends="struts-default">
<action name="Echo" class="mao.shu.action.EchoAction">
<result name="echo.page">echo_show.jsp</result>
</action>
</package>
-
<package>中的namespace="/"属性与<result>元素中的内容一起组合成完整路径:/echo_show.jsp,所以这个页面一定要保存在根路径之中
-
定义echo_show.jsp
-
此时需要使用一些Struts2的显示标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="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>echo</title>
</head>
<body>
<h1><s:property value="msg"/></h1>
<s:form action="Echo.action" method="post">
<s:textfield key="msg" label="请输入内容"></s:textfield>
<s:submit value=发送/>
</s:form>
</body>
</html>
- 此处使用了Struts2.x标签完成,在实际开发中不会使用此标签
- 启动tomcat发布项目,访问以下路径
- http://localhost:8080/FirstStruts2Project/EchoAction
- 在MVC标准开发过程之中,一个路径绝对不能够直接去访问一个*.jsp页面,必须通过Action跳转到JSP页面,如果直接访问 echo_show.jsp页面
- 发送一个中文数据
- 这个时候使用标签可以直接于Action中的属性联系在一起(getter方法),对比EchoActioin程序类和struts.xml文件的配置
Struts2.x原理分析
- Struts2.x的开发都是基于过滤器完成的,对于过滤器的操作,需要执行两次,请求过滤,回应过滤.
1 由于现在使用了Struts2.x标签,那么对于程序执行,就必须严格遵守过滤器跳转到JSP页面.实际上也属于WEB的标准流程.
-
用户首先要发送一个请求到Struts处理的过滤器上去,输入的路径是"*.action",而这个路径是由web.xml文件负责配置的,
- 本质是告诉用户哪里可以进行请求的处理,但是在一个项目里面很明显会使用多个Action:
-
而后将请求提交到过滤器中后,实际上并不是由过滤器来负责处理的,而是过滤器会根据struts.xml文件中的配置的Action的名字.会根据对应的类型取之于之对应的Action处理类的名称:
-
而后会默认调用ActionSupport抽象类中的execute()方法,而且此方法是被子类所复写的.
-
当EchoAction中的execute()方法执行完毕之后,返回一个字符串,“echo.page”
- 在每一个Action里面都可能同时返回多个路径,所以每一个路径都是用了"<result>"元素标注.
-
在Servlet定义的服务器端跳转只有一种:RequestDispatcher,这个时候相当于<package>元素中的"namespace"属性结合来定位出每一个跳转的完整路径,而后利用RequestDispatcher接口提供的forward()方法实现跳转: