`

struts2的工作流程

阅读更多

 

 

1.Struts2的简介

首先简单介绍下struts2是干什么的。

 Struts2是一个web应用框架。它不是一个Struts的新的发布版本,而是一个全新的框架。Struts2是第二代基于Model-View-Controller(MVC)模型的web应用框架。Struts2是java企业版web应用的可扩展性的框架。它是WebWork和Struts社区合并后的产物。struts2没有继承struts1的血统,而是继承了webwork的血统。

2.什么是MVC模型

 MVC模型指的是模型-视图-控制器(Model-View-Controller)。MVC模型有助于将应用程序分割成三个组件,使得程序设计更加的容易,并使各个组件之间的耦合程度降到最低。MVC中三个组件分别是:模型(Model)、视图(View)和控制器(Controller).

  •  模型(Entity)
        模型代表应用程序的数据以及用于访问控制和修改这些数据的业务规则
  •  视图(JSP)
        视图用来组织模型的内容。视图对象使用对象模型的查询方法以获得数据,并将数据显示给用户
  •  控制器(Dao,Service)
        控制器定义了应用程序的行为。它负责对来自视图的用户请求进行解析,并把这些请求映射成相应的行为,这些行为由模型负责实现。

3.Struts2的架构


简单分析一下它的工作原理:首先,由用户发出一个请求,经过过滤器(Dispatcher Filter),然后经过一系列的拦截器(Interceptor),通过拦截器的请求会到达Model中的Action类,请求可以通过setxxx()方法给Action中的属性赋值,然后执行相应的execute()方法,根据方法的返回值跳转到相应的JSP.JSP可以通过getxxx()方法从Action中取值,最后给用户做出响应。

4.struts2与传统架构的区别

一般的都采用:JSP+Servlet+JavaBean


Struts2:所有的Servlet都由控制器来管理


5.Struts2的工作流程及其相应的代码

 (1).首先,struts2需要一个xml配置文件config.xml,用来配置Action中的一些方法

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<action name="user" class="com.hpu.action.UserAction" method="execute">
		<result name="success">WEB-INF/views/suc.jsp</result>
		<result name="error" type="redirect">/login.action</result>
	</action>	
</config>

class:值为相应的Action的完全限定名

method:如果method的值为"execute",则可以省略method属性

result:name属性的值是对应的method方法的放回值;如果type值为“dispatcher”则type属性可以省略

 

 (2).其次,书写相应的Action方法 (其实,应该先写Action方法,然后在配置相应的xml文档)

package com.hpu.action;
public class UserAction {
	public String execute(){
		//xxxx在这里 你可以做你想做的事
		if(2 >= 1){
			return "success";
		}
		return "error";
	}
}

 注:方法的修饰符必须是public,并且放回类型是String,没有参数列表

 

(3).配置Controller,简单点也就是配置过滤器

 

package com.hpu.core;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.hpu.tag.AcctionTag;
import com.hpu.tag.ResultTag;


public class DispatcherFilter implements Filter{

	private Map<String, AcctionTag> config = new HashMap<String, AcctionTag>();
	@SuppressWarnings("unchecked")
	public void init(FilterConfig filterConfig) throws ServletException {
		SAXReader sax = new SAXReader();
		Document doc;
		try {
			doc = sax.read(DispatcherFilter.class.getClassLoader().getResourceAsStream("cofig.xml"));
			Element root = doc.getRootElement();	//获取根节点
			List<Element> actionList = root.elements("action");
			
			AcctionTag acctionTag = new AcctionTag();
			for (Element action : actionList) {
				acctionTag.setName(action.attributeValue("name"));
				acctionTag.setClassName(action.attributeValue("class"));
				acctionTag.setMethod(action.attributeValue("method"));
				
				List<ResultTag> resultTagList = new ArrayList<ResultTag>();
				List<Element> resultList = action.elements("result");
				for (Element result : resultList) {
					ResultTag resultTag = new ResultTag();
					resultTag.setName(result.attributeValue("name"));
					resultTag.setType(result.attributeValue("type"));
					resultTag.setValue(result.getText());
					resultTagList.add(resultTag);
				}
				acctionTag.setResultList(resultTagList);
				config.put(acctionTag.getName(), acctionTag);
			}
			
		} catch (DocumentException e) {
			e.printStackTrace();
		} 
	}

	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		
		String url = request.getRequestURI();
		if(url.endsWith(".action")){
			url = url.substring(1,url.indexOf(".action"));
			if(config.containsKey(url)){
				
				AcctionTag acctionTag = config.get(url);
				String className = acctionTag.getClassName();
				try {
					Class<?> clazz = Class.forName(className);
					Object obj = clazz.newInstance();
					
					Method method = clazz.getMethod(acctionTag.getMethod());
					String result = method.invoke(obj).toString();	//获取相应方法的返回值
					//看看该返回值是否有配置,然后在找到相应的跳转
					List<ResultTag> resultTagList = acctionTag.getResultList();
					ResultTag rt = null;
					for (ResultTag resultTag : resultTagList) {
						if(resultTag.getName().equals(result)){
							rt = resultTag;
							break;
						}
					}
					
					if(rt == null){
						response.sendError(404, "没找到"+result+"配置项");
					}else{
						//找到相应的配置,进行页面的跳转
						String type = rt.getType();
						if("redirect".equals(type)){
							response.sendRedirect(rt.getValue());
						}else{
							request.getRequestDispatcher(rt.getValue()).forward(request, response);
						}
					}
					
				} catch (Exception e) {
					e.printStackTrace();
				}
				
			}else{
				response.sendError(404, "未找到你请求的URL!");
			}
			
		}else{
			chain.doFilter(request, response);
		}
		
	}
	public void destroy() {
		
	}
	
}

在过滤器的inint方法中解析config.xml文档,在doFilter方法中过滤以“.action”结尾的URL请求,并且做出对应的响应。

 

 还需要在web.xml中配置过滤器

<filter>
  	<filter-name>ControllerFilter</filter-name>
  	<filter-class>com.hpu.core.DispatcherFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>ControllerFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

 

再次阐述Struts2的请求流程:

 首先,客户端发出一个请求,该请求经过过滤器,过滤器首先会解析config.xml文档,完了之后,根据URL找到配置文件中action的name属性值,判断URL请求是否存在,如果存在,根据反射机制找到class属性对应的对象,根据method执行该对象对应的方法,然后获取返回值,由返回值再找到action节点的result节点,根据跳转类型进行跳转。

  • 大小: 80.6 KB
  • 大小: 62.6 KB
  • 大小: 55.7 KB
分享到:
评论

相关推荐

    Struts2工作流程

    **Struts2工作流程详解**: 1. **客户端请求**:用户通过浏览器发起HTTP请求,目标通常是一个Action,如`http://localhost:8080/yourApp/yourAction.action`。 2. **过滤器链**:请求首先经过一系列过滤器,包括`...

    Struts2工作流程图

    虽然Struts2号称是一个全新的框架,但这仅仅是相对Struts 1而言。Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度...

    struts2工作流程

    在深入探讨Struts2的工作流程之前,我们先了解一下MVC模式的基本概念。MVC模式将应用逻辑分隔为三个部分:模型(Model)处理业务逻辑,视图(View)负责展示数据,控制器(Controller)协调用户输入和模型间的交互。...

    struts2小程序 struts2代码

    这些配置是理解程序工作流程的关键。 3. **Interceptor拦截器**:拦截器允许在Action执行前后插入自定义逻辑,如日志、权限检查等。在项目中,可能会看到如`params`、`validation`、`exception`等内置拦截器的使用...

    Struts2 工作原理 Struts2框架 有图

    ### 二、Struts2工作流程详解 #### 1. 请求初始化 一切始于客户端发起的HTTP请求,该请求通常包含用户提交的数据和请求的资源标识符。请求首先到达Web服务器的Servlet容器,如Apache Tomcat。 #### 2. 过滤器链 ...

    Struts1与Struts2原理 区别详解汇总

    #### Struts2工作流程 1. **用户提交请求**:客户端通过HTTP协议向服务器发送请求。 2. **FilterDispatcher拦截请求**:所有的请求首先被FilterDispatcher捕获。 3. **ActionMapper确定Action**:...

    Struts2工作机制

    总的来说,Struts2的工作流程大致为:请求到达-&gt;过滤器Dispatcher拦截-&gt;查找Action映射-&gt;创建Action实例-&gt;执行拦截器链-&gt;调用Action的execute方法-&gt;返回Result-&gt;渲染视图。这种设计允许开发者将业务逻辑、数据验证、...

    Struts2 应用程序示例

    首先,Struts2是基于Model-View-Controller (MVC)设计模式的,它简化了从前端到后端的交互流程。在Struts2中,Action类扮演控制器的角色,处理用户的请求,并调用模型层进行业务逻辑处理。同时,Struts2通过配置文件...

    struts2工作原理

    struts2工作原理、请求响应流程。。。。。。。。。。。。。。。

    struts2 原理 解析 图

    这张图是理解Struts2工作流程的重要辅助工具,通过它你可以直观地看到每个组件如何协同工作。 `struts原理.txt`文件可能包含了文字描述,进一步解释了Struts2的核心概念和机制,比如Action的配置、结果映射、拦截器...

    Struts2框架程序示例

    通过学习和实践这个Struts2框架程序示例,开发者可以深入理解Struts2的工作原理,掌握如何创建Action、编写Interceptor、配置Action与Result的映射,以及如何利用Struts2的其他特性来提高开发效率和代码质量。...

    struts2教程源代码

    理解不同的结果类型,如“dispatcher”(用于转发到JSP)和“stream”(用于下载文件),是掌握Struts2工作流程的关键。 4. **拦截器**:Struts2的拦截器机制允许在Action调用前后插入自定义逻辑,如日志、权限检查...

    Struts2的工作流程及配置文件

    ### Struts2的工作流程及配置文件详解 #### 一、Struts2简介 Struts2是基于MVC设计模式的Java Web开发框架之一,它继承了Struts1的优点,并在此基础上进行了大量的改进和扩展。Struts2框架的核心是拦截器...

    struts2示例程序

    这个"struts2示例程序"是为了帮助初学者理解并熟悉Struts2框架的基本概念和工作流程。该程序基于Struts2的2.0.14版本,这是Struts2的一个较早版本,但其核心概念和机制在后续版本中仍然适用。 Struts2的核心特性...

    struts2项目开发

    Struts2 项目开发 Struts2 是一个基于 Java Web 的框架,广泛应用于 Web ...通过了解 Struts2 框架的应用、开发流程、技术架构、实践经验等方面的知识点,可以更好地应用 Struts2 框架,开发高质量的 Web 应用程序。

Global site tag (gtag.js) - Google Analytics