关于Struts 2.x的学习记录:
三、开发第一个Struts 2.x程序(编写ECHO程序)
3.项目建立完成后,会自动在src目录之中建立一个struts.xml文件,这个文件就是Struts 2.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>
Struts 2.x的所有的处理操作都由过滤器完成
4.本次将完成一个ECHO程序,即:由用户在文本框中输入一段文字,而后在文字前增加“ECHO:”的信息返回到页面上进行显示
范例:开发EchoAction
**所有的Struts 2.x应用程序都要求继承自ActionSupport“com.opensymphony.xwork2.ActionSupport”这个父类
public class EchoAction extends ActionSupport {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
//执行操作
public String execute() throws Exception{
this.msg="ECHO:"+this.msg;
return "echo.page";//返回路径的映射的key
}
}
那么现在控制器就完成了
5.所有的程序都一定要在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>
<!-- 所有的Struts 2.x程序都要求设置命名空间 -->
<package name="root" namespace="/" extends="struts-default"></package>
</struts>
在此程序当中“<package>”主要定义页面的可执行路径,如果设置为“/”(namespace="/"),那么就表示映射到根路径下,但是在配置文件里面有一些是需要父配置文件给予的支持(例如:自动赋值,数据转换等),所以使用继承一个父的配置文件(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>
<!-- 所有的Struts 2.x程序都要求设置命名空间 -->
<package name="root" namespace="/" extends="struts-default">
<!-- 配置程序所需要的Action的名称以及对应的类型 -->
<action name="EchoAction" class="com.lyt.action.EchoAction">
<!-- 定义跳转路径 -->
<result name="echo.page">echo.jsp</result>
</action>
</package>
</struts>
那么此时,Struts 2.x的Action配置完成
6.在根路径下开发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>Struts 2.x 开发实战</title>
</head>
<body>
<h1><s:property value="msg"/></h1>
<s:form action="EchoAction.action" method="post">
<s:textfield key="msg" label="请输入信息"></s:textfield>
<s:submit value="发送"/>
</s:form>
</body>
</html>
此时的echojsp负责内容的输入以及内容的显示
7.在所有标准MVC设计模式之中,不应该通过路径直接访问一个JSP页面,所有的jsp页面必须经过Servlet进行跳转后显示,所以在这一点上Struts 2.x强烈秉行着这一特征,所以要想正常访问页面,必须要首先访问Action,然后通过Action跳转到一个JSP页面。
如果此时使用了Struts 2.x标签,那么里面的属性跳转后会与标签的相关组件进行自动匹配,但是从实际的开发来看,这样的自动匹配意义不大
总结:通过以上的开发发现,整个Struts 2.x与Struts 1.x相比优秀在以下几点:
**避免了ActionForm的强制定义问题
**在配置文件之中定义简单
**在处理过程之中,所有的请求是先提交到过滤器,而后根据struts.xml文件的配置进行相关Action的查找,调用execute()方法后再跳转回指定的JSP页面,整体的处理流程要比Struts 1.x容易
**支持的标签更加简化,但是Struts 2.x的标签严格来讲不如Struts 1.x干净