项目建立完成之后会自动在src目录之中建立一个struts.xml文件,这个文件就是Struts2.x的核心配置文件,同时也会在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>*.action</url-pattern> </filter-mapping>
Struts2.x的所有的处理操作都由过滤器完成的.
本次将完成一个ECHO程序,即用户在文本框输入一段文字,而后在文字前增加"ECHO"返回到页面上进行显示.
范例:开发EchoAction
●所有的Struts 2.x 应用程序都要求继承自om.opensymphony.xwork2.ActionSupport父类.
package cn.zwb.action; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class EchoAction extends ActionSupport { private String msg; public void setMsg(String msg) { this.msg = msg; } public String getMsg() { return msg; } @Override public String execute() throws Exception {//执行操作 this.msg="ECHO"+this.msg; return "echo.page"; //返回路径映射的key } }
那么现在控制器就完成了.Struts
所有的程序都一定要在struts.xml文件里面进行配置.
范例:修改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> <!-- 所有的Struts2.x程序都要求设置命名空间 --> <package name="root" namespace="/" extends="struts-default"/> </struts>
此程序之中"<package>"主要定义页面的可执行路径,如果设置为"/"(namespace="/"),那么就表示映射到根路径下,但是在配置文件里面有一些是需要父配置文件给予的支持(例如:自动赋值,数据转换等),所以使用extends继承一个父的配置文件(extends="struts-default"/).每一个"</package>"下具有多个"<action>"的设置.
<?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> <!-- 所有的Struts2.x程序都要求设置命名空间 --> <package name="root" namespace="/" extends="struts-default"> <!-- 配置程序所需要的Action的名称以及对应的类型 --> <action name="EchoAction" class="cn.zwb.action.EchoAction"> <!-- 定义跳转路径 --> <result name="echo.page">echo.jsp</result> </action> </package> </struts>
此时Struts2.x的配置完成.
在根路径下开发echo.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="s" uri="/struts-tags" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>one</title> </head> <body> <h1><s:property value="msg"/></h1> <s:form action="EchoAction.action" method="post"></s:form> <s:textfield key="msg" label="请输入信息"></s:textfield> <s:submit valut="发送"></s:submit> </body> </html>
此时的echo.jsp负责内容的输入以及内容的显示,
在所有的MVC设计模式之中,不应该通过路径直接访问一个jsp页面,所有的jsp页面必须经过Servlet进行跳转后显示,所以在这一点上Struts 2.x强烈秉性这以特征,所以要想正常访问页面,必须要首先访问Action,然后通过Acation跳转到一个jsp页面.
如果此时使用了Struts2.x标签,那么里面的属性跳转后会与标签的相关组件进行自动匹配,但是这样的自动匹配意义不大.
总结 通过以上的开发可以发现,整个Struts2.x与Struts1.x相比优秀在以下部分:
避免了ActionForm的强制定义问题;
在配置文件之中定义简单
在处理过程之中,所有的请求是先提交到过滤器,而后根据struts.xml文件进行相关的查找,调用excute()方法后再跳转回指定的JSP页面,整个的处理流程要比Struts1.x容易
支持的标签更加简化,但是Struts2.x的标签严格来讲不如Struts1.x干净