struts2总结

1.了解struts的访问机制

拿页面表单提交来说吧!首先当用户点击提交按钮后,浏览器根据action中的值访问服务器端的struts.xml配置文件,找到action标签中name等于这个url的标签,根据此标签定义的class去java的web层,也就是继承actionsupport的struts控制器,找到对象的class中对应的method,经过一系列业务逻辑处理,最后此方法return一个字符串,最后struts去struts.xml中回到刚才那个action标签,找到result中name等于一个字符串中定义的jsp页面,最后客户端浏览器跳到这个页面!这是struts访问的一个最基本的业务流程。虽然写法不一,但是万变不离其宗,流程是一样的!如果你真想跟踪,那只能拿到源代码用eclipse一步步debug!!!

 

前言
Struts2是一个相对流行的MVC框架。在说Struts2之前,我们先回顾一下传统的servlet/jsp实现的MVC架构,其运行机制是:jsp页面(视图view)发送消息到servlet(控制器Controller),servlet获取请求数据,处理业务逻辑,分发转向。这样的话,servlet就太臃肿了,什么活儿都是servlet在干,而且业务逻辑全是硬编码,代码都写死了不利于维护。

Struts2框架的MVC分别对应:
V:jsp+OGNL
C:action类
M:javabean+ModelDriven

Struts2框架的控制器将“获取请求”和“分发转向”代码抽取出来写在配置文件里,这样一来,控制器(action类)就能专注于业务逻辑的处理了。

正文
1,一个完整的Struts2项目的web目录结构及主要文件的执行流程

各文件执行流程关系

 

由上图可以看出,Struts2的MVC各个部分都是围绕着struts.xml文件执行的,这样就解放了控制器的负担,而且解决了硬编码的问题。

2,Struts2框架的内部执行过程
上面讲了MVC中个文件的执行过程,那只是一小部分,现在来看一下整个struts2框架的执行机制,下面的图来源于官网,然后加了自己的改动。

由上图看出,整个框架的运行又紧紧围绕着核心过滤器StrutsPrepareAndExecuteFilter展开工作。深入到filter的源码中会对理解有所帮助。下面几篇博客对filter的介绍很好。

(1),struts2请求过程源码分析:博客1
(2),Struts 2配置文件加载顺序:博客2

3,默认拦截器
struts-default.xml配置文件中定义了一个默认拦截器栈,这些拦截器就是动作方法执行之前的要执行的。常用的有封装用户表单数据到javabean的modelDriven拦截器,用于输入验证的validation拦截器,等等。

4,View和Controller之间的交互
从视图页面每次发来的用户请求都会产生一些数据,这些数据都存放在哪儿呢?实际上,每次动作类执行前,核心过滤器StrutsPrepareAndExecuteFilter都会创建2个对象:ActionContext和ValueStack,这2个对象存储了动作访问期间用到的所有数据。这些数据又可以在jsp页面上通过strut标签和OGNL表达式来取得。

(1),ActionContext是一个map数据结构,其中的key是一些常见的域对象(application,session,request等),而value又是一个map。也就是说ActionContext是一个大map包裹着一些小map。

(2),ValueStack是一个ArrayList数据结构,并且是一个栈结构,每次都在栈顶存取数据。

5,Controller与Model之间的交互
C和M之间的交互比较简单,利用Struts框架提供的拦截器:ModelDriven,即可实现将用户表单提交的数据封装到对应的javabean中。要点:(1)javabean类自己编写。(2)动作类要实现ModelDriven接口。(3)实现抽象方法getModel()。

总结
本文从宏观角度解读了Struts2框架的基本结构,每个部分的具体细节以后再讲。

2.struts2+Hibernate总结:

1.jsp页面中引入:

<%@ page import="commonj.sdo.DataObject"%>通过动态类型创建DataObject
package com.waysoft.intergration.dao;
 
import org.apache.tuscany.sdo.api.SDOUtil;
 
import commonj.sdo.DataObject;
import commonj.sdo.Type;
import commonj.sdo.helper.HelperContext;
import commonj.sdo.helper.TypeHelper;
 
public class Test3 {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		HelperContext scope = SDOUtil.createHelperContext();
 
		scope.getTypeHelper().define(getCustomerType());
 
		DataObject customer = scope.getDataFactory().create(
				"http://example.com/customer", "Customer");
 
		customer.setInt("custNum", 123);
		customer.setString("firstName", "范德萨");
		customer.setString("lastName", "太热");
 
		// --DataObject
		try {
			scope.getXMLHelper().save(customer, "http://example.com/customer",
					"customer", System.out);
			System.out.println();
		} catch (Exception e) {
			e.printStackTrace();
		}
 
	}
 
	protected static DataObject getCustomerType() {
		HelperContext scope = SDOUtil.createHelperContext();
		TypeHelper typeHelper = scope.getTypeHelper();
 
		Type intType = typeHelper.getType("commonj.sdo", "Int");
		Type stringType = typeHelper.getType("commonj.sdo", "String");
 
		DataObject customerType = scope.getDataFactory().create("commonj.sdo",
				"Type");
		customerType.set("uri", "http://example.com/customer");
		customerType.set("name", "Customer");
 
		DataObject custNumType = customerType.createDataObject("property");
		custNumType.set("name", "custNum");
		custNumType.set("type", intType);
 
		DataObject firstNameType = customerType.createDataObject("property");
		firstNameType.set("name", "firstName");
		firstNameType.set("type", stringType);
 
		DataObject lastNameType = customerType.createDataObject("property");
		lastNameType.set("name", "lastName");
		lastNameType.set("type", stringType);
 
		return customerType;
	}
 
}


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值