Struts2知识点总结
- 格式:docx
- 大小:2.28 MB
- 文档页数:14
Struts2学习之二--Struts2标签介绍热12已有 14625 次阅读 2009-07-12 18:53[顶]3G移动--Android开发工程师全能班(转) Struts2学习之二--Struts2标签介绍在上一篇文章《为Struts 2.0做好准备》中,我过于详细地介绍了Struts 2.0开发环境和运行环境的配置,所以,本文很少涉及的以上两方面的细节。
如果,您看完《为Struts 2.0做好准备》后,还有什么不明白,或者没法运行文中例子,请联系我。
我的E-MAIL:Max.M.Yuan@。
在介绍常用标志前,我想先从总体上,对Struts 1.x与Struts 2.0的标志库(Tag Library)作比较。
分类将标志库按功能分成HTML、Tiles、Logic和Bean等几部分严格上来说,没有分类,所有标志都在URI为“/struts-tags”命名空间下,不过,我们可以从功能上将其分为两大类:非UI标志和UI标志表达式语言(expression languages)不支持嵌入语言(EL)OGNL、JSTL、Groovy和Velcity以上表格,纯属个人总结,如有所不足或错误,请不吝指正好了,我要开始介绍“常用”(这里所谓的“常用”,是指在已往工作中使用Struts里经常用到的)的标志了。
1.非UI标志o if、elseif和else描述:执行基本的条件流转。
参数:名称必需默认类型描述备注test 是Boolean 决定标志里内容是否显示的表达式else标志没有这个参数id 否Object/String 用来标识元素的id。
在UI和表单中为HTML的id属性例子:<%@ page contentType="text/html; charset=UTF-8" %><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Condition Flow</title></head><body><h3>Condition Flow</h3><!--这里有点小技巧:本来可以用#[0]来获得,请求中name的值。
一.Struts2基础知识1. struts2的特点及配置1.1struts2与struts1的比较1)在软件设计上struts2没有struts1那样跟ServletApi和StrutsApi有着紧密的耦合,Struts2的应用可以不因爱ServletApi和StrutsApi.struts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计public class OrderListAction ectends Action//struts依赖于java2)Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能3)Struts2提供了类型转换器,我们可以把特殊的请求参数转换成我们需要的类型,在struts1中,如果我们实现同样的功能,就必须向struts1的底层实现BeanUtil注册类型转换器4)Struts2提供了支持多种表现层技术,如JSp,freeMarker等5)Struts2的输入校验可以对指定方法进行校验,解决了Struts的长久之疼6)提供了全局范围,包范围和Action范围的国际化资源文件管理实现1.2搭建struts2的开发环境1)新建web项目2)导入必要的包3)写配置文件Struts2默认的配置文件为Struts.xml,该文件需要存放在WEB-INF/classes下,该文件的配置模板如下(在m yeclipse中放在src目录下就可以了)模板在D:\Program Files\struts-2.3.4.1-all\struts-2.3.4.1\apps 解压struts2-blank.var再打开web-info/classes中的struts.x m l文件即可<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration2.3//EN""/dtds/struts-2.3.dtd"><struts></struts>4)在web.xm l中加入Struts2MVC框架启动配置在struts1.x中struts框架是通过Servlet启动的,在struts2中,struts框架式通过Filter 启动的,他在web.xm l中的配置如下:(D:\Program Files\struts-2.3.4.1-all\struts-2.3.4.1\apps 解压struts2-blank.var再打开Web-Info\web.xm l即可)<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.Str utsPrepareAndExecuteFilter</filter-class><!—自从struts2.1.3以后,下面的FilterDispatcher已经标注为过时<filter-class>org.apache.struts2.dispatcher.ng.filter.FilterDispather</filter-class> --></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>在StrutsPrepareAndEXecuteFilter()方法中将会读取类路径下的默认文件struts.xml完成初始化操作。
Struts1与struts2的区别总结1,背景:Struts2并不是struts1的升级版,两者没有太大的关系,struts2是继承了webwork的机制,吸收了struts2和webwork的有优势。
Struts2是基于WebWork的一个全新框架. Struts2主要改进是取代了Struts1的Servlet和Action. Struts2的核心框架是当作一个filter来实现其功能的,而Struts1是ActionServlet.然后在Action上,Struts1都少不了要传递Request等参数,还要继承Action父类,而Struts2只要实现了一个public String execute()就可以了,这样Action就可以实现脱离Servlet 测试. Struts2还提供了拦截器(Interceptot)等Struts1所没有的技术.2,Action类Struts1要求action继承一个抽象基类,而struts2既可以继承类又可以实现action对应的接口,即接口编程,可以实现多个接口,使得可选和订制服务成为可能。
3,线程模式Struts1中的action是单例模式,会涉及到线程安全问题,因为仅有一个action来处理所有的请求,而struts2则是非单例模式,每个请求对应一个action,这样就不用考虑线程安全的问题(而且,servlet容器会给每个请求产生可丢弃的对象,这样就不会导致性能和垃圾回收问题)。
4,可测性Struts1中的action有个主要的问题是execute方法暴露了servlet API,这使得测试等需要依赖servlet容器。
一个第三方扩展--struts TestCase--提供了一套struts模拟对象来进行测试;而struts2 中的action可以通过初始化和设置属性(例如action当中直接用get和set方法),调用方法来测试,“依赖式注入”注入也使得测试更容易5,servlet依赖Struts1中的action依赖于servlet API,因为当一个action被调用时,HttpServletRequest和HttpServletResponse对象会被传递给execute方法(请求和响应的对象需要依赖于execute方法,即servlet API);而struts2中的action则不需要依赖于servlet容器,允许action脱离容器单独被测试(例如:struts2中获取请求的对象可以用ServletActionContext.getRequest())。
struts2框架特征Struts2框架特征Struts2是一种流行的Java Web应用程序开发框架,其特征使其成为许多开发者的首选。
本文将介绍Struts2框架的特征,包括MVC 架构、强大的标签库、拦截器、数据验证、国际化支持以及灵活的配置等。
一、MVC架构Struts2采用了MVC(Model-View-Controller)架构,将应用程序的业务逻辑、数据模型和用户界面分离。
这种架构使开发者能够更好地组织代码、提高代码的可维护性,并能够更容易地进行代码重用和测试。
在Struts2中,Model代表数据模型,可以是POJO(Plain Old Java Object)或者是与数据库交互的实体类;View代表用户界面,通常是JSP页面;Controller则负责处理用户请求、调用业务逻辑,并将处理结果返回给用户。
二、强大的标签库Struts2提供了丰富的标签库,使开发者能够更轻松地构建用户界面。
这些标签库包括表单标签、数据展示标签、控制流标签等,可以大大简化页面开发的工作量。
例如,开发者可以使用Struts2的表单标签库来生成表单,并自动处理表单的数据绑定、验证和错误提示。
这样,开发者无需手动编写大量的HTML和JavaScript代码,能够更快速地完成表单开发。
三、拦截器Struts2的拦截器是其核心特性之一,可用于在请求到达Controller之前和之后执行一些通用的处理逻辑,如日志记录、权限验证、异常处理等。
开发者可以通过配置拦截器栈,将多个拦截器按照特定的顺序组合起来,实现复杂的请求处理流程。
拦截器的使用使得开发者能够将通用的处理逻辑从业务逻辑中分离出来,提高了代码的可维护性和重用性。
同时,Struts2还提供了许多内置的拦截器,如参数封装拦截器、文件上传拦截器等,方便开发者处理不同类型的请求。
四、数据验证在Web应用程序中,数据验证是一项重要的任务。
Struts2提供了强大的数据验证机制,开发者可以通过简单的配置实现对表单数据的验证。
Struts笔记1.Hibernate和struts整合 (2)2.ResultType (2)3.OGNL (3)4.拦截器 (4)5.Action和result (5)6.i18n国际化 (7)7.Struts标签 (8)8.类型转换类的三种配置形式: (9)9.struts2中方法验证的三种形式 (10)10.MVC思想及其优势 (11)1.Hibernate和struts整合1.Hibernate的作用是针对数据表的操作,对JDBC进行封装。
一张表就是一个对象,存进表的数据就是一个一个的对象。
2.核心配置文件Hibernate.cfg.xml3.struts2 他是比较标准的MVC模式:分别只带的是模型视图控制器hibernate和struts在一起写一个增删查改的操作1.创建工程2.导入hibernate Jar包Struts Jar包3.核心配置文件Hibernate.cfg.xml的核心文件和数据库连接上4.创建POJO 创建POJO.hbm.xml 映射到核心的配置文件中5.通过创建一个创表的类把表创建出来6.创建客户端的JSP页面7.配置web.xml 创建Action 创建struts.xml8.在Tomcate上发布在运行2.ResultType如果一个或者多个action 中有同样的结果,可以配置全局结果集,减少重复代码3.OGNL访问Action值栈中的普通属性:<s:property value="dog"/><br>获取值栈中对象的属性:<s:property value="dog.people.pname"/><br>调用对象中的普通方法:<s:property value="dog.people.getMsg()"/><br>访问action中的方法:<s:property value="show()"/><br>访问action中的静态方法:<s:propertyvalue="@com.softeem.action.ActionDemo@getMsg()"/><br/>Math类的中方法:<s:property value="@@max(6,7)"/><br>访问普通类中的构造器:<s:property value="new com.softeem.pojo.People()"/><hr/><br>访问list集合长度:<s:property value="list.size()"/><br>访问list集合中对象的属性:<s:property value="list.get(0)"/>|<s:propertyvalue="list.{pname}[0]"/><br>访问set集合:<s:iterator value="set" var="dog"><s:property value="#dog.dname"/></s:iterator><br>访问map集合:<s:property value="map"/><br>获取map集合中所有的键:<s:property value="map.keys"/><br>获取map集合中所有的值:<s:property value="map.values"/><br>访问map集合中指定对象:<s:property value="map.get('来福')"/>|<s:propertyvalue="map[\"来福\"].dcolor"/><br><hr><br>获取值栈中的普通属性:<s:property value="dog"/><br>获取值栈中对象的属性:<s:property value=""/><br>调用对象中的普通方法:<s:property value="dog.p.getMsg()"/><br>访问action中的方法:<s:property value="show()"/><br>访问action中的静态方法:<s:property value="@com.softeem.action.OgnlAction@getMsg()"/><br/>Math类的中方法:<s:property value="@@max(6,7)"/><br>访问普通类中的构造器:<s:property value="new com.softeem.action.People()"/><hr/><br>访问list集合:<s:property value="list.size()"/><br>访问list集合中对象的属性:<s:property value="list.get(0)"/>|<s:property value="list.{name}[0]"/><br>访问set集合:<s:iterator value="set" var="dog"><s:property value="#"/></s:iterator><br>访问map集合:<s:property value="map"/><br>获取map集合中所有的键:<s:property value="map.keys"/><br>获取map集合中所有的值:<s:property value="map.values"/><br>访问map集合中指定对象:<s:property value="map.get('小黑')"/>|<s:property value="map[\"小黑\"].color"/><br><hr><br>投影(过滤):<br>取出age>18所有对象<s:property value="list.{?#this.age>18}"/><br>取出所有age>18的对象的第一个<s:property value="list.{^#this.age>18}"/><br>取出所有age>18的对象的最后一个<s:property value="list.{$#this.age>18}"/><br>取出所有名字为'来福'的狗<s:property value="list.{?#=='来福'}"/><br>取出值栈中的对象:<s:property value="[0]"/><s:debug></s:debug>4.拦截器自定义一个拦截器<interceptors><interceptorname="proInterceptor"class="com.softeem.intercepter.ProInterceptor" ></interceptor>配置拦截器栈<interceptor-stack name="myStack"><interceptor-ref name="proInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors>拦截器和过滤器的区别:①过滤器在首次请求的时候就会执行,拦截器在任意时候都可以执行②过滤器对所有的请求(servlet/jsp)都会过滤,拦截器可以精确的拦截任何一个action<action name="testAction" class="com.softeem.action.TestAction"><result>/main.jsp</result>引入指定拦截器:配置其他拦截器之前,需要引入struts2提供的默认拦截器defaultStack,否则当前拦截器会将默认拦截器覆盖<interceptor-ref name="defaultStack"></interceptor-ref>自定义拦截器:使用自定义拦截器,需要现在当前包中配置拦截器<interceptor-ref name="myInterceptor"></interceptor-ref></action>创建拦截器的步骤:1:创建一个类实现Interceptor接口,实现三个方法(destory、init、intercept) 2:在struts.xml中进行配置,声明当前过滤器声明拦截器:当一个拦截器声明之后,可以被多个action使用<interceptors><interceptorname="interceptor01"class="com.softeem.type.intercept ors.MyInterceptor"></interceptor><interceptorname="interceptor02"class="com.softeem.type.intercept ors.MySecondInterceptor"></interceptor>我们可以将多个拦截器定义成一个“拦截器组”,可以通过引用这个拦截器组从而达到引用这个组中所有的拦截器的目的<interceptor-stack name="stack1"><interceptor-ref name="interceptor01"></interceptor-ref><interceptor-ref name="interceptor02"></interceptor-ref></interceptor-stack>我们同样可以将多个拦截器和已经存在“拦截器组”放在一起生成一个新的“拦截器组”<interceptor-stack name="stack2"><interceptor-ref name="stack1"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><action name="user" class="erAction"> <result name="index">/index.jsp</result>如果当前action没有手动的引用其他的拦截器,则默认引用了Struts2的defaultStack 拦截器一旦我们手动引用了拦截器,则defaultStack拦截器组就不被自动引用,我们需要手动引用拦截器的执行顺序和被引用的顺序一致<interceptor-ref name="stack2"></interceptor-ref></action>5.Action和result1,Struts2配置文件中的模块包含将另外一个xml配置文件作为struts.xml文件的一部分引入到struts.xml<include file="name.xml"/>意义在于项目开发时的并行开发(版本控制工具同步管理)2,struts2的默认Action:当用户访问的页面不存在的时候跳转到默认action页面访问index.actionstruts.xml配置文件<default-action-ref name="index"></default-action-ref><action name="index"><result>/error.jsp</result></action>3,Action总结:action类三种方式DMI动态调用方法!通配符配置*-*jsp页面值传递到action中的接收三种方式简单的参数验证访问web元素包含文件配置默认action处理4,struts.xml中的result的类型配置<result type=""></result>默认类型dispatcher,运用服务器跳转(视图页面)5,全局的result配置(GlobalResult)package标签下<global-results><result name=""></result></global-results>思考:如果一个package要使用另一个package中的result?6,结果集:result的类型(主要两种)全局结果集动态结果传递参数7,struts2的动态结果集在配置文件中:<result name="">${attrName}</result>$可以在配置文件中从action中取值在action添加attrName属性,并赋值8,带参数的结果集在rusult中使用$取到action中的值传递到action跳转的页面<result type="redirect">/xxx.jsp?abc=${attrName}</result>6.i18n国际化国际化的解释ResourceBandle实例Struts实例native2ascii 源文件名目标文件名properties级别问题action:文件名要和Action的类名一致package:名字必须是package_..._....propertiesapplication:名字可以随意,但是需要配置struts.custom.i18n.resoutces 处理资源文件中的参数 login.message=welcome:{0}<s:text value="login.message"><param value="username"></param></s:text>国际化语言动态切换request_locale=en_US/zh_CN<a href="language?request_locale=en_US">EN</a><a href="language?request_locale=zh_CN">CN</a>---------------------------------------------------------1,i18n的原理:根据参数不同的值,根据相同的key在不同的文件中取到不同的value2,实例运行3,properties文件的级别action级别:配置文件的前缀名必须和类名保持一致,只在访问这一个action的时候加载package级别:配置文件的前缀名必须是package,在访问当前包下面的action都会加载application:配置文件的前缀名没有要求,需要在struts.xml中进行配置,在服务器启动时加载4,使用国际化步骤:①创建全局的properties资源文件(注意命名)②在struts.xml中加载properties资源文件③在页面使7.Struts标签1,struts标签分为:通用标签控制标签UI标签(展现)2,通用标签:propertyproperty标签中的value属性默认是一个object<s:propertyvalue="username"/>表示根据在值栈中根据username取到一个对象显示property取值为字符串<s:property value="'哈哈'"/>表示直接显示一个"哈哈"字符串,直接显示的字符串要加上单引号property的默认值:<s:property value="admin" default="管理员"/>如果根据admin在值栈中取值没有取到,则显示默认值property设定HTML:<s:property value="'<hr/>'" escape="true"/> 如果没有加上escape="true",表示直接显示字符串set在request或者ActionContext中存入信息:<s:set var="user" value="Obj"/> 默认存放在request和ActionContext中,value值为对象从request中取值:<s:property value="#er"/>从ActionContext中取值:<s:property value="#user"/>默认取值空间为ActionContext范围的设置:<s:set name="key" value="password" scope="page"/>beanbean 定义bean,使用param来设定新的属性值<s:bean name="er" var="user1"><s:param name="username" value="'张三'"></s:param></s:bean>var表示新创建的对象的名字,如果没有var属性就不能在Context stack中找到s:param给新创建的对象属性赋值,注意valueinclude(解决中文问题很麻烦)包含静态文件:<s:include value="/test.jsp"></s:include>用%包含文件:<s:set var="incPage" value="'/test.jsp''}"/><s:include value="incPage"></s:include><s:include value="#incPage"></s:include><s:include value="%{#incPage}"></s:include>paramdebug3,控制标签:if elseif elseiteratorsubset(截取集合的一部分)4,UI标签:theme(主题)struts.xml中控制theme,默认为xhtml,可以设置为simple/css_htm/ajax <constant name="struts.ui.theme" value="css_htm"/>5,$#%的区别$用于i18n和struts的配置文件中#用于取ActionContext的值%将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用8.类型转换类的三种配置形式:actin级别:配置文件的名字:action-conversion.properties内部配置:ation对应的属性名=转换类的路径配置文件的存放位置:和action位置相同说明:当用户访问这个action中这个属性的时候才调用类型转换类pojo级别:配置文件的名字:pojo-conversion.properties配置文件的存放位置:和pojo的位置相同内部配置:pojo对应的属性名=类型转换类的路径说明:当用户访问任何action,只要提交了这个pojo中的这个属性的时候就会调用类型转换类src级别:配置文件的名字:xwork-conversion.properties配置文件的存放位置:直接存放在src下内部配置:属性类型(+包名)=类型转换类的路径说明:用户访问任何action,只要提交了对应类型的属性的时候就会调用类型转换类当我们转换类继承的是StrutsTypeConverter,需要重写两个方法:convertFromString(在用户向action提交数据的时候调用)convertToString,将指定类型的数据转换成String类型(在action向页面跳转的时候调用)struts2数据校验分为手工验证和自动验证手工验证:指的是在对应的action里面通过validate方法对这个action里面的属性进行校验validate方法是重写,它是在ValidateAble接口中定义的所以我们这个action要实现ValidateAble接口才能完成校验但是ActionSupport已经实现了ValidateAble接口,所以我们创建的action只要继承了ActionSupport,就可以重写validate自动验证:使用xwork里面提供的验证,通过配置文件对action的属性进行验证9.struts2中方法验证的三种形式1,采用注解annotation形式:在不需要验证的方法前加上@SkipValidation2,正对每一个需要验证的方法单独生成一个配置文件,例如在UserAction中有两个方法add()和delete()并且我们假设只对add()方法进行校验,配置如下:-----------------struts.xml------------------------------------- <!-- 需要对add()方法单独添加一个配置,并且要以这个action标签的那么属性“user_add”作为alias添加一个验证配置文件,如下: --><action name="user_add" class="erAction" method="add"><result>/success.jsp</result><result name="input">/index.jsp</result></action><!-- 配置这个action主要是为了让其他的请求能进入其他的方法 --><action name="user_*" class="erAction" method="{1}"><result>/success.jsp</result><result name="input">/index.jsp</result></action>---------------------------------------------------------------- 新创建一个validation.xml配置文件,命名为【UserAction-user_add-valication.xml】3,采用拦截器形式(验证框架的配置文件UserAction-validation.xml):即,给默认拦截器配置拦截参数,配置如下:<action name="user_*" class="erAction" method="{1}"><result>/success.jsp</result><result name="input">/index.jsp</result><interceptor-ref name="defaultStack"><param name="validation.excludeMethods">*</param><param name="validation.includeMethods">delete</param> </interceptor-ref></action>在<param name="validation.includeMethods"></param>标签里面写出需要验证的方法名字如果有多个方法,方法名以“,”隔开,例如要验证add和delete方法:<param name="validation.includeMethods">add,delete</param> 10.MVC思想及其优势MVC并不是Java语言所特有的设计思想,也并不是Web应用所特有的思想,它是所有面向对象程序设计语言都应该遵守的规范。
配置ActionStruts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法。
该方法如下:public String execute() throws ExceptionStruts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方法即可:public String xxx()在实际开发中,action类很少直接实现Action接口,通常都是从com.opensymphony.xwork2.ActionSupport类继承,ActionSupport实现了Action接口和其他一些可选的接口,提供了输入验证,错误信息存取,以及国际化的支持,选择从ActionSupport继承,可以简化action的定义。
开发好action之后,好需要对action进行配置,以告诉Struts2框架,针对某个URL的请求应该交由哪个action进行处理。
1.Action映射:action映射是Struts2框架中的基本”工作单元”,action映射就是将一个请求URL(即action的名字)映射到一个action类,当一个请求匹配某个action的名字时,框架就使用这个映射来确定如何处理请求。
action元素的完整属性表例如:<action name="user" class="erAction"><result name="success">/user.jsp</result></action>2. 使用method属性在配置action时,我们可以通过action元素的method属性来指定action调用的方法,所指定的方法,必须遵循与execute方法相同的格式。
struts2.Struts2课件1Mvc与servlet1.1 Servlet的优点1、是mvc的基础,其他的框架⽐如struts1,struts2,webwork都是从servlet基础上发展过来的。
所以掌握servlet是掌握mvc的关键。
2、Servlet把最底层的api暴漏给程序员,使程序员更能清楚的了解mvc的各个特点。
3、程序员可以对servlet进⾏封装。
Struts2就是从servlet中封装以后得到的结果。
4、市场上任何⼀个mvc的框架都是servlet发展过来的,所以要想学好struts2这个框架,了解servlet的运⾏机制很关键。
1.2 Servlet的缺点1、每写⼀个servlet在web.xml中都要做相应的配置。
如果有多很servlet,会导致web.xml内容过于繁多。
2、这样的结构不利于分组开发。
3、在servlet中,doGet⽅法和doPost⽅法有HttpServletRequest和HttpServletResponse参数。
这两个参数与容器相关,如果想在servlet中作单元测试,则必须初始化这两个参数。
4、如果⼀个servlet中有很多个⽅法,则必须采⽤传递参数的形式,分解到每⼀个⽅法中。
2重构servlet针对servlet以上的特点,我们可以对servlet进⾏重构,使其开发起来更简单。
更容易,更适合团队协作。
重构的⽬标:1、只写⼀个serlvet或者过滤器,我们这⾥选择过滤器。
2、不⽤再写任何的servlet,这样在web.xml中写的代码就很少了。
3、原来需要写serlvet,现在改写action。
4、在action中把HttpServletRequest参数和HttpServletResponse参数传递过去。
5、在过滤器中通过java的反射机制调⽤action。
6、详细过程参照cn.itcast.action包中的内容3Struts2介绍1、struts2是apache组织发明的开源框架。
第一章Struts2系统架构本章主要介绍的Struts2的系统架构,让学员对Struts2框架在结构上有一个整体概念为我们以后更加详细的学习Struts2打下一个良好的基础。
第一节Struts2的系统架构及处理的主要流程1.Struts1简介Struts1的历史比较久远,Struts1是世界上第一个发布的MVC框架,目前市场率最高的框架。
下面将简单讲解Struts1的基本架构。
图1-1显示了Struts1的数据流图。
图1-1 Struts1数据流图Struts1框架以ActionServlet为核心控制器,ActionServlet获得客户端请求。
然后ActionServlet根据请求信息调用匹配的业务逻辑控制器(Action)处理用户请求。
请求处理完成后,业务逻辑处理器调用相应的JSP显示处理结果。
Struts1框架实现了MVC模式,下面我们了解一下Struts1是怎样实现MVC模式的。
Struts1框架中并没有提供Model层的实现。
在实际的企业应用中,通过一个JavaBean 实现一个业务逻辑,在功能比较复杂的应用中也采用EJB或WebService服务实现业务逻辑。
Struts1框架的View层采用JSP实现。
Struts1提供了大量丰富的标签库。
这些标签库与Struts的组件兼容的特别好,可以很容易的输出控制器的处理结果。
Struts1框架中,控制器是它的核心,Struts1的控制器由两部分组成:核心控制器(ActionServlet)和业务逻辑控制器(Action),核心控制器由Struts1框架提供。
业务逻辑控制器需要由用户自己继承Struts1框架提供的Action类实现。
在Struts1框架中,JSP/Servlet耦合非常紧密。
这种紧密关系促使Struts1存在各种缺陷。
下面我们分析一下Struts1中存在的缺陷。
●支持的表现层技术单一●耦合性强,不便于单元测试●代码依赖于Struts1 API,侵入性强2.WebWork简介WebWork出自于开源组织opensymphony,实际的创始人是Java领域的名人Rickard Oberg(JBoss和XDoclet的作者)。
Struts 2的基本流程Struts 2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。
在这3个部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。
2.核心控制器:FilterDispatcherFilterDispatcher是Struts 2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求。
如果用户请求以action结尾,该请求将被转入Struts 2框架处理。
Struts 2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件,例如,对于login.action请求,Struts 2调用名为login的Action来处理该请求。
Struts 2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action时,定义了该Action的name属性和class属性,其中name属性决定了该Action处理哪个用户请求,而class属性决定了该Action的实现类。
Struts 2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理——因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。
而Struts 2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action 的execute方法来处理用户请求。
显然,上面的处理过程是典型的AOP(面向切面编程)处理方式。
图3.19显示了这种处理模型。
图3.19 Struts 2的拦截器和Action从图3.19中可以看出,用户实现的Action类仅仅是Struts 2的Action代理的代理目标。
开发工具:MyEclipse6Web服务器:Tomcat6Struts版本:Struts2.0.11.1JDK版本:JDK1.5.0_12J2EE版本:Java EE5.0在本系列教程中Web工程的上下文路径都是struts2,如果在Web根目录有一个index.jsp文件,则访问路径如下:http://localhost:8080/struts2/index.jsp由于MyEclipse6目前并不支持Struts2,所以我们需要到去下载Struts2安装包。
要想正常使用Struts2,至少需要如下五个包(可能会因为Struts2的版本不同,包名略有差异,但包名的前半部是一样的)。
struts2-core-2.0.11.1.jarxwork-2.0.4.jarcommons-logging-1.0.4.jarfreemarker-2.3.8.jarognl-2.6.11.jarStruts2虽然在大版本号上是第二个版本,但基本上在配置和使用上已经完全颠覆了Struts1.x的方式(当然,Struts2仍然是基于MVC模式的,也是动作驱动的,可能这是唯一没变的东西)。
Struts2实际上是在Webwork基础上构建起来的MVC框架。
我们从Struts2的源代码中可以看到,有很多都是直接使用的xwork(Webwork的核心技术)的包。
既然从技术上来说Struts2是全新的框架,那么就让我们来学习一下这个新的框架的使用方法。
如果大家使用过Struts1.x,应该对建立基于Struts1.x的Web程序的基本步骤非常清楚。
让我们先来回顾一下建立基于Struts1.x的Web程序的基本步骤。
1.安装Struts。
由于Struts的入口点是ActionServlet,所以得在web.xml中配置一下这个Servlet。
2.编写Action类(一般从org.apache.struts.action.Action类继承)。
Struts部分: (1)1)为什么要学习Struts框架 (2)2)为什么使用MVC? (2)3)MVC在JavaWeb中的实现 (2)*4) Struts2的主要工作流程 (2)3.Struts2框架的历史 (4)*4.Struts2框架基本使用 (4)1.Struts2使用基本规则 (5)Struts2标签+OGNL表达式 (6)2)OGNL工作原理 (6)4.OGNL在Struts2中的应用 (8)1)xwork对ognl进行扩展和改造 (8)*2)ValueStack对象(参考valuestack.jpg) (9)*3)在JSP中访问ValueStack数据方法 (9)a.使用Struts标签+OGNL表达式 (9)b.使用EL表达式 (9)1.Struts2框架Action组件的核心应用 (10)1)Action组件基本原理 (10)*3)Action属性注入 (11)*4)如何利用一个Action处理多个请求 (11)1.前期课程回顾 (11)1.Result组件原理 (12)1)Result组件的作用 (12)2)Result组件实现规则 (12)*2.常用的几种Result组件 (13)2)Action响应 (13)1.Struts2标签 (14)1)通用标签 (14)2)表单标签 (15)2.拦截器组件 (15)*2)掌握自定义拦截器的使用 (16)Struts部分:======================Day01=========================1)为什么要学习Struts框架Struts框架是MVC设计模式的实现,基于Struts开发可以简化开发难度,提高开发效率。
2)为什么使用MVC?MVC是一个非常优秀的设计思想,基于该思想架构程序,可以提高程序的结构灵活性,便于日后维护、扩展和升级。
3)MVC在JavaWeb中的实现Servlet,JSP,Filter,JDBCa.原ShoppingCart程序就是一个MVC结构实现View实现部分:采用JSP组件实现Model实现部分:采用DAO、Entity等组件实现Controller实现部分:采用ActionServlet组件实现b.ShoppingCart程序虽然基于MVC,但结构还有一些问题:当请求数量比较多时,需要在Servlet中编写大量的if...else分支语句,而且Servlet代码量非常多。
Struts2面试题1、struts2工作流程Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。
核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。
业务控制器Action和业务逻辑组件是需要用户来自己实现的。
用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。
Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是WebWork的升级版本。
基本简要流程如下:1 、客户端初始化一个指向Servlet容器的请求;2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3 、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
1.struts2 步骤1.创建web项目2.添加struts2的必须jar包3.添加支持(配置web.xml文件)4.创建界面和相应的action5.配置struts.xml文件6.部署运行项目2.struts2的工作流程1. 浏览器发送一个请求。
2. 核心控制器FilterDispatcher根据请求决定调用合适的Action。
3. 拦截器(Intercepter)自动对请求应用通用功能,如验证等。
4. 回调Action的execute方法,该execute方法根据请求的参数来执行一定的操作。
5. Action的execute方法处理结果信息将被输出到浏览器中,支持多种形式的视图。
3.struts2的配置文件1.web.xml2.struts.xml(核心管理Action映射) 自己配置的3.struts-default.xml是struts2框架默认加载的配置文件。
它定义struts2一些核心的bean和拦截器。
这些拦截器是以key-value对的形式配置在struts-default.xml中,其中name是拦截器名字,就是后面使用该拦截器的引用点,value则指定拦截器的实现类。
4.struts.properties(核心管理属性) 自己配置的5.default.properties(核心管理属性)4.<struts>标签下的子标签配置1.<bean type="com.opensymphony.xwork2.ObjectFactory" name="struts"class="org.apache.struts2.impl.StrutsObjectFactory" />2.<include file="struts1.xml"></include>3.<constant name=“key” value=“value” />4.<package></package>5.package标签下的配置1.<action name="loginAction" class="com.action.loginAction"><result name="success">/welcome.jsp</result><result name="error">/index.jsp</result></action>2.<global-results><result></result></global-results>3.<global-exception-mappings><exception-mapping result="error"exception="java.long.Exception"></exception-mapping></global-exception-mappings>……………………………………6.action类实现Action接口和继承ActionSupport7.通过ActionContext类获得context(request),再通过context获得session和application context.put("key","value");session.put("key","value");session.put("key","value");public class ServletActionContext (org.apache.struts2)public static PageContext getPageContext()public static HttpServletRequest getRequest()public static HttpServletResponse getResponse()public static ServletContext getServletContext()8.在action中直接使用一个对象,两种方式:1.在提交表单时name属性为:对象.xxxx2.实现ModelDriven<类类型>接口和其方法。
Struts2拦截器一、什么是拦截器?1、拦截器,在AOP(Aspect-Oriented Programming<面向切面编程>)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。
它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。
同时也是提供了一种可以提取action 中可重用的部分的方式。
2、拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。
拦截器链就是将拦截器按一定的顺序联结成一条链。
在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
3、如何使用struts2拦截器,或者自定义拦截器。
特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):<interceptor-ref name="checkbox"><param name="uncheckedValue">0</param></interceptor-ref><interceptor-ref name="defaultStack"/>(必须加,否则出错)4、也可以改为对全局Action设置自己需要的拦截器,如下:在struts.xml里面定义全局的配置设置<package name="struts-shop" extends="struts-default"><interceptors><interceptor-stack name="myStack"><interceptor-ref name="checkbox"><param name="uncheckedValue">0</param></interceptor-ref><interceptor-ref name="defaultStack"/></interceptor-stack></interceptors><default-interceptor-ref name="myStack"/>(这句是设置所有Action自动调用的拦截器堆栈)</package>struts-action.xml里面配置Action如下:<package name="LogonAdmin" extends="struts-shop">(这里扩展struts.xml里面定义的配置就可以了)<action name="logon" class="logonAction"><result>/jsp/smeishop/admin/index.jsp</result> <resul t name="error">/jsp/smeishop/admin/logon.jsp</result><result name="input">/jsp/smeishop/admin/logon.jsp</result> </action><action name="logout" class="logoutAction"><result>/jsp/smeishop/admin/logon.jsp</result></action></package>二、Struts2自带的配置及其拦截器配置1、Struts2 拦截器 [Interceptor]拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。
Struts2基础知识
Struts2概述
1.Struts2框架应用javaee三层结构中的web层框架。
2.Struts2框架在struts1和webwork基础之上发展的全新框架。
3.Struts2所解决的问题:
在以往实现一个功能时,都需要写很多的servlet,从而造成后期维护上的不方便。
图解:
4.现在比较稳定的Struts2版本
struts-2.3.24-all.zip
5.web层常见框架
1.struts
2.springMVC
Struts2框架入门
1.导入jar包
1.在lib里面有jar包,但不能全部导入,因为里面含有一些spring
包,是不能使用的,导入会导致程序不能运行。
2.到app目录里面复制案例的jar包是最好的方法。
2.创建action
3.配置action类的访问路径
1.创建struts2核心配置文件,该核心配置文件位置和名称是固定的,
位置必须在src下面,名称为struts.xml 。
2.引入dtd约束,可以在案例文件中找到,复制在struts.xml文件中即
可。
3.action的配置
*注意访问路径:
http://域名/端口号/项目名/action名.action
注意:.action可以省略,但建议不要省略,为了兼容一些老版本的浏览器。
4.配置Struts2的过滤器,可以在案例中的web.xml文件中找到,复制粘贴
即可。
Struts2执行过程
图解:
Struts2配置
1.是一种常量标签
2.修改Struts2的默认常量值
1.常用方式
在struts.xml中进行配置。
2.其它两种方式
1.在src下面创建struts.properties文件并修改。
2.在web.xml文件中进行修改。
3.Struts2最常用的常量
struts.il8n.encoding=UTF-8,解决表单在通过post方式提交中文时,中文乱码的问题。
Struts2笔记(一)
可使用全局页面。
1、配置方法:
在package标签下配置
2、注意:该标签只能在一个package标签中使用,如果有多个标签,
需要重新定义。
3、局部结果页面:指的就是在action标签里配置
1、配置方法:
在action标签下配置
2、注意:如果既配置了全局,又配置了局部,会以局部为准,全局不起
作用。
4、type属性
1、使用ActionContext类。
1、主要使用的方法:
因为该方法是对象方法,所以需要一个ActionContext对象来调用,而创建ActionContext对象可以使用该类的一个静态方法来创建
2、使用ServletActionContext类。
1、主要使用的方法:
3、使用接口注入方法(一般不用)。
Struts2笔记(二)
可使用全局页面。
1、配置方法:
在package标签下配置
2、注意:该标签只能在一个package标签中使用,如果有多个标签,
需要重新定义。
3、局部结果页面:指的就是在action标签里配置
1、配置方法:
在action标签下配置
2、注意:如果既配置了全局,又配置了局部,会以局部为准,全局不起
作用。
4、type属性
1、使用ActionContext类。
1、主要使用的方法:
因为该方法是对象方法,所以需要一个ActionContext对象来调用,而创建ActionContext对象可以使用该类的一个静态方法来创建
1、主要使用的方法:
3、使用接口注入方法(一般不用)。
Struts2笔记(三)
1、在lib文件夹中加入Ognl的jar包。
2、在jsp页面中引入Struts2标签库。
3、使用标签<s:property>,并给属性value设置值,比如求一个字符串
的长度案例。
3、获取值栈步骤:
1、获取ActionContext对象
2、调用ActionContext的静态方法getValueStack()
4、值栈的内部结构
1、第一部分 root,结构是list集合,底层继承自ArrayList集合。
2、第二部分 context,结构是Map集合,底层实现了Map接口。
Struts2笔记(四)
1、#号:使用#号获取context里面的数据。
使用时格式是#context的key名称.域对象名称,如#request.req。
2、%号:可以在Struts2标签中使用OGNL表达式。
1、概述:拦截器就是Struts2框架中封装的功能的容器。
在Struts2框架中有很多的功能,所有就有很多的拦截器,并不是每次都执行所有的拦截器,它只会执行一些默认的拦截器。
2、默认拦截器的位置
3、拦截器的执行时间
在action对象创建之后,action的方法执行之前。
4、拦截器的原理(两个原理)
1、AOP思想:即面向切面编程,当在基本的功能上扩展其它功能时,不
通过改源代码来实现扩展功能的方式。
2、责任链模式
1、概述:属于java设计模式中的一种,和过滤链原理相似。
2、过滤链:一个请求可以有多个过滤器进行过滤,只有每个过滤器
执行放行操作,该请求才能到下一个过滤器。
3、AOP原理和责任链模式如何应用到拦截器中
1、在action中并没有执行拦截器的方法,而是用配置文件实现的,
这种方法就是使用的AOP思想。
2、在执行拦截器的过程中,只有每个拦截器执行放行操作后,才能
进入到下一个拦截器,这种方法就是责任链模式。
1、拦截器的结构
继承类
在接口内的三个抽象方法
2、自定义拦截器方法
2、通过配置文件的方式让拦截器和action产生关系
1、在要拦截的action标签所在的package标签里声明拦截器
2、在具体的action标签里面使用声明的拦截器
3、Struts2里面执行很多默认的拦截器,但是如果在action里面配
置了自定义拦截器,默认的拦截器就不会执行了,所以要解决。
即把默认的拦截器再配置一次
注意:这样配置拦截器,对action里面的所有方法都会进行拦截。
3、配置拦截器对某些方法不进行拦截。