勿谓今日不学而有来日,勿谓今年不学而有来年。
日月逝矣,岁不我延。

Struts2的HelloWorld项目

前言

现在开始学习三大框架的Structs2框架,学习一个新的语言或者工具自然要先向她问好了:HelloStruts2!问好也不能只是简单的syso一下,要学会对比,接下来我会对比一下Struts1和Struts2的不同,梳理一下Struts2的环境搭建以及完成简单的HolleWord项目,之后会对比Struts和Filter作为Controller的不同,以此对Struts2问好!

Struts2概述

Struts2 是一个用来开发 MVC 应用程序的框架. 它 提供了 Web 应用程序开发过程中的一些常见问题的解决方案:

  • 对来自用户的输入数据进行合法性验证
  • 统一的布局
  • 可扩展性
  • 国际化和本地化
  • 支持 Ajax
  • 表单的重复提交
  • 文件的上传下载
  • …..

Struts2 VS Struts1

Struts2 从本质上讲已不是从 Struts1 扩展而来的, 说它是一个换了品牌标签的 WebWork 更合适。

  1. Struts1 里使用 ActionServlet 作为控制器; Struts2 使用了一个过滤器作为控制器
  2. Struts1 中每个 HTML 表单都对应一个 ActionForm 实例. Struts2 , HTML 表单将被直接映射到一个 POJO.
  3. Struts1 的验证逻辑编写在 ActionForm 中; Struts2 中的验证逻辑编写在 Action .
  4. Struts1 中, Action 类必须继承 org.apache.struts.action.Action 类; Struts2 中任何一个 POJO 都可以是一个 Action .
  5. Struts2 在页面里使用 OGNL 来显示各种对象模型, 可以不再使用 EL 和 JSTL
  • 在体系结构方面更优秀:

类更少, 更高效:  在 Struts2 中无需使用 “ActionForm来封装请求参数.

扩展更容易:  Struts2 通过拦截器完成了框架的大部分工作. 在 Struts2 中插入一个拦截器对象相当简便易行.

  • 更容易测试:

                       即使不使用浏览器也可以对基于 Struts2 的应用进行测试。

Struts2的环境搭建

Struts2的下载

项目配置

  1. 解压struts-2.3.34-all.zip,找到目录下的struts2-blank.war
  2. 加入 jar : 复制 struts\apps\struts2-blank\WEB-INF\lib 下的所有 jar 包到当前 web 应用的 lib 目录下.
  3. web.xml 文件中配置 struts2: 复制 struts\apps\struts2-blank1\WEB-INF\web.xml 文件中的过滤器的配置到当前 web 应用的 web.xml 文件中
  4. 在当前 web 应用的 classpath 下添加 struts2 的配置文件 struts.xml: 复制 struts1\apps\struts2-blank\WEB-INF\classes 下的 struts.xml 文件到当前 web 应用的 src 目录下.

HelloStruts2

具体项目源码请参考我的GitHub

需求和目录

编写jsp和POJO

index.jsp

只包含一个超链接

<body>
	<a href="product-input.action"> Product Input</a>
</body>

input.jsp

一个简单的表单

<body>
	<form action="product-save.action" method="post">
		
		表单1:<input type="text" name="fname">
		<br>
		<br>
		表单2:<input type="password" name="fage">
		<br>
		<br>
		<br>
		表单3:<input type="text" name="fsex">
		<br>
		<br>
		<input type="submit" value="提交">
			
	</form>
</body>

details.jsp

EL输出

<body>
	姓名: ${fname}
	性别:${fsex}
	年龄:${fage}
</body>

Product.java

类的封装

package cn.llanc.HolleWord;

public class Product
{
	String fname;
	String fage;
	String fsex;
	public String getFname()
	{
		return fname;
	}
	public void setFname(String fname)
	{
		this.fname = fname;
	}
	public String getFage()
	{
		return fage;
	}
	public void setFage(String fage)
	{
		this.fage = fage;
	}
	public String getFsex()
	{
		return fsex;
	}
	public void setFsex(String fsex)
	{
		this.fsex = fsex;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString()
	{
		return "Product [fname=" + fname + ", fage=" + fage + ", fsex=" + fsex + ", getFname()=" + getFname()
				+ ", getFage()=" + getFage() + ", getFsex()=" + getFsex() +"]";
	}
	
	public String save() {
		System.out.println("Save"+this);
		return "details";
	}
	
	
}

web.xml和struts.xml的配置

web.xml

参考 项目配置 中的第三条,实际是配置一个过滤器以拦截所以的请求,这个Filter的名字就是StrutsPrepareAndExecuteFilter

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Struts2-learn-2</display-name>
  
  <!-- struts2的filter -->
  <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>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

struts.xml

struts.xml中关于请求的配置要写在<package>标签中(用于组织模块)。

每个<package>标签要有一个name 和 extend(一般继承struts-default,位于struts2-core-2.3.34.jar下的struts-default.xml中的名为struts-default的<package>)。

在package下配置子节点<action>,<action>也有个那么属性(属性值即为struts2请求的名字但是不包含其拓展名)或有个ServletPath(去除/和拓展名)。<action>下有子节点<result>

详细说明参考以下代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

        <!--  
		package: 包. struts2 使用 package 来组织模块. 
		name 属性: 必须. 用于其它的包应用当前包. 
		extends: 当前包继承哪个包, 继承的, 即可以继承其中的所有的配置. 通常情况下继承 struts-default
		         struts-default 这个包在 struts-default.xml 文件中定义.
		namespace 可选, 如果它没有给出, 则以 / 为默认值. 
		                        若 namespace 有一个非默认值, 则要想调用这个包里的Action, 
		                        就必须把这个属性所定义的命名空间添加到有关的 URI 字符串里
		                        
		          http://localhost:8080/contextPath/namespace/actionName.action
	-->

	<package name="HellowWord" extends="struts-default">
		<!-- 
    		配置一个 action: 一个 struts2 的请求就是一个 action 
    		name: 对应一个 struts2 的请求的名字(或对一个 servletPath, 但去除 / 和扩展名), 不包含扩展名
    		class 的默认值为: com.opensymphony.xwork2.ActionSupport
    		method 的默认值为: execute
    		result: 结果. 
    	        -->
		<action name="product-input">
			<result>/WEB-INF/pages/input.jsp</result>
		</action>
		<action name="product-save" class="cn.llanc.HolleWord.Product" method="save">
                        <!--  
    			result: 结果. 表示 action 方法执行后可能返回的一个结果. 所以一个 action 节点可能会有多个 result 子节点.
    			多个 result 子节点使用 name 来区分
    			name: 标识一个 result. 和 action 方法的返回值对应. 默认值为 success
    			type: 表示结果的类型. 默认值为 dispatcher(转发到结果.)
    		        -->
			<result name="details">/WEB-INF/pages/details.jsp</result>
		</action>
	</package>

</struts>

Struts2请求相应过程

 

使用Struts2实现HolleWord VS 使用Filter实现HolleWord

使用Filter实现HolleWord

jsp页面基本与上相同只是details.jsp的EL输出要加上请求域和对象,如:${requestScope.Product.fname}

另外不需要XML的配置,但需要一个Filter:

FilterDispathcher.java:

在doFilter方法中处理请求

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding("UTF-8");
		HttpServletRequest req=(HttpServletRequest)request;
		response.setContentType("text/html;charset=utf-8");
		String servletPath=req.getServletPath();
		String path=null;//要转发的地址
		
		if("/product-input.action".equals(servletPath)) {
			path="/WEB-INF/pages/input.jsp";
		}else if ("/product-save.action".equals(servletPath))
		{
			String fname= request.getParameter("fname");
			String fage= request.getParameter("fage");
			String fsex= request.getParameter("fsex");
			Product product=new Product(fname, fage, fsex);
			request.setAttribute("Product", product);
			path="/WEB-INF/pages/detais.jsp";
		}
		System.out.println(path);
		if(path!=null){
			request.getRequestDispatcher(path).forward(request, response);//请求转发
			return;
		}
		chain.doFilter(request, response);
	}

struts2优势

  1. 大量减少了代码。
  2. 不需要显式的定义 Filter, 而使用的是 struts2 的配置文件。
  3.  details.jsp 比先前变得简单了。
  4. 请求处理模块化,结构清晰。

小结

Struts2框架作为一个优秀的MVC模式框架,很值得深入学习和掌握。作为我学习的三大框架的第一个,我相信,掌握它会给我以后的学习和工作带来非常大的帮助!

博观而约取,厚积而薄发。

赞(0)
未经允许不得转载:喋喋不休 » Struts2的HelloWorld项目

评论 抢沙发

评论前必须登录!

 

精品网站

有券无忧电脑壁纸精选