Struts2 详解

前面咱们经过下面两篇博客,已经对 Servlet 有了比较深入的理解,那么接下来咱们详细介绍 Servlet 的升级版框架----Struts2html

     Servlet 详解:http://www.cnblogs.com/ysocean/p/6912191.htmljava

     改进 Sevlert ----Struts2入门: http://www.cnblogs.com/ysocean/p/6913484.htmlweb

 

首先咱们仍是回顾一下 Servlet 的缺点:apache

  ①、一个请求对应一个 Servlet,即每个请求咱们都须要在 web.xml 文件中配置映射。若是项目大,请求不少,那么会形成 web.xml 很大,很难维护。设计模式

  ②、即使在好几个请求对应一个 Servlet,即在 service() 方法中,经过 if--else 语句来判断执行的代码块。那这样就会形成 service() 方法很拥挤。tomcat

  ③、一个项目只存在一个 web.xml 文件,若是一个项目是多人开发,那么整合代码开发过程当中会有不少问题。不适合团队开发。安全

  ④、Servlet中doGet方法和doPost方法中的两个参数reqeust,response拥有严重的容器依赖性。服务器

  ⑤、若是页面上表单中的元素比较复杂,则在Servlet的方法中获取表单元素的数据比较繁琐。多线程

  ⑥、Servlet是单线程的,只要在Servlet中的声明一个实例变量,那么该变量在多线程访问时就会有线程安全问题。app

  ⑦、在Servlet中处理异常,若是Servlet中有N个方法,则这N个方法必须都要try--catch。由于子类抛的异常不能大于父类。

 

  而在这篇博客中:改进 Sevlert ----Struts2入门: http://www.cnblogs.com/ysocean/p/6913484.html 咱们已经解决了相应的一些问题,可是并无彻底解决。而彻底解决的办法就是咱们这篇文章的主角------Struts2

 

一、什么是 Struts2 ?

  Struts2是一个基于MVC设计模式的Web应用框架,它本质上至关于一个servlet,在MVC设计模式中,Struts2做为控制器(Controller)来创建模型与视图的数据交互。Struts 2是Struts的下一代产品,是

struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差异巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的

设计也使得业务逻辑控制器可以与ServletAPI彻底脱离开,因此Struts 2能够理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,可是相对于WebWork,Struts 2的变化很小。

 

二、Struts2 入门实例(先无论原理是什么,先看是怎么实现的)

  第一步:建立一个 web 工程,并将相应的 jar 包复制到 lib 目录下

  

 

   第二步:在 WEB-INF 目录下,建立 web.xml 文件,并添加 struts2 拦截器

<?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">
   
  <!-- 配置Struts2的过滤器 -->
	<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>

  

  第三步:在 src 目录下,建立一个Java文件,HelloWorldAction,包名为 com.ys.action

package com.ys.action;

public class HelloWorldAction {
	
	public String execute(){
		System.out.println("执行Action.....");
		return "success";
	}

}

  

  第四步:在 src 目录下,建立 struts.xml 文件,并添加以下代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
   <package name="user" namespace="/" extends="struts-default">
     	<action name="helloAction" class="com.ys.action.HelloWorldAction">
     		<result name="success">success.jsp</result>
     	</action>
   </package>  
</struts>	

  

   第五步:咱们建立一个 index.jsp 文件,而后点击页面上的超连接,跳转到 success.jsp 页面

index.jsp 页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
	<a href="helloAction">点击跳转到 success.jsp 页面</a>
</body>
</html>  

 

success.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
	success.jsp
</body>
</html>

  

 验证:咱们将项目发布到 tomcat 服务器,而后输入连接:http://localhost:8080/HelloStruts2/index.jsp

  

  而后鼠标点击 超连接,发现页面跳转到 以下界面:

  

 

三、struts2 执行流程

  

 

 

 

tomcat 服务器启动时作的工做

  ①、加载 web.xml 文件配置的过滤器,调用过滤器的 init()方法,初始化全部资源文件,主要包括 default.properties 文件,struts-default.xml,strut-plugin.xml,struts.xml 文件

 

struts2 执行流程

一、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

二、这个请求通过一系列的过滤器(Filter)(这些过滤器中有一个叫作ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其余框架的集成颇有帮助,例如:SiteMesh Plugin);

三、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否须要调用某个Action;

四、若是ActionMapper决定须要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

五、ActionProxy经过Configuration Manager询问框架的配置文件,找到须要调用的Action类;

六、ActionProxy建立一个ActionInvocation的实例。

七、ActionInvocation实例使用命名模式来调用,在调用Action的过程先后,涉及到相关拦截器(Intercepter)的调用。

八、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果一般是(但不老是,也多是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。在表示的过程当中可使用Struts2框架中继承的标签。在这个过程当中须要涉及到ActionMapper。

相关文章
相关标签/搜索