struts2_day03笔记
Struts2学习笔记
Struts1是一个优秀的框架,但是还是具有很多不好的地方,如Action和ActionForm严重倚赖系统框架中的API。
如ActionForm必须继承ActionForm,Action控制器继承Action,测试麻烦。
Struts2是基于webwork发展而来,并非struts1使用MyEclipse8.5版本,可自动添加依赖struts2的系统库Struts2原理:说明:Struts2没使用Servlet作为核心控制器,而是换做一个Filter过滤器来进行,其类是org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 过滤器所拦截的请求是<url-pattern>/*</ url-pattern>(当然根据版本的不同,过滤器类也不同,如Org.apache.Struts2.dispatcher.FilterDispatcher)如果请求中带有.action或.do,则转入Struts2框架处理。
配置文件:Web.xml中:<filter><filter-name>struts2</filter-name><!-版本不同这里的配置不同-→<!—<filter-class>Org.apache.Struts2.dispatcher.FilterDispatcher</filter-class>→<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFi lter</filter-class><init-param><param-name>config</param-name><param-value>struts-default.xml,struts-plugin.xml,../struts.xml </param-value></init-param></filter><filter-mapping><filter-name>struts2</ filter-name><url-pattern>/*</ url-pattern></filter-mapping>Struts.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN""/dtds/struts-2.1.dtd"> <struts><!—这个package可以处理文件同名的情况,一般不会更换-- ><package name="default"extends="struts-default"namespace="\"> <action name="Login"class="com.test.action.LoginAction"><result name="cheng">/index.jsp</result><result name="bai">/fail.jsp</result></action></package></struts>配置文件说明:1、package中的name为了区分不同的包2、extends是继承的包名3、namespace是提交时区分的地址,如namespace=”user”,则提交时需要加入action=”/user/xxx.action”控制其中的代码,其中数据直接封装和页面表单元素名称对应。
struts2学习笔记
(3).
HttpServletRequest request=ServletActionContext.getRequest();//得到request
(4).实现ServletRequestAware等
国际化实现中英文切换:
两个超链接:<s:a action="changeLanguage?flag=zh">中文</s:a>
<s:a action="changeLanguage?flag=en">英文</s:a>
ChangeLanguageAction中内容:
public class ChangeLanguageAction {
{
struts.i18n.encoding=UTF-8 //设置编码格式
}
6.重定向跳转也可传Action中的属性值
<param name="username">${ername}</param>
7.struts2 中设置request ,session,application值
locale=;
context.setLocale(locale);
}
context.getSession().put("WW_TRANS_I18N_LOCALE",locale);
//必须将此WW_TRANS_I18N_LOCALE存放在session中
return "input";
}
}
11.struts2 文件上传下载,下载时需配置如下
struts2学习笔记
一、Struts2的一些优点:1、struts2没有像struts1一样跟servletAPI和struts1API有紧密的耦合2、struts2提供了拦截器,利用拦截器可以进行AOP编程,实现权限拦截等功能。
3、struts提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型,4、struts2提供支持多种表现层技术,如:JSP、freeMaker、velocity等。
5、struts2的输入校验可以对指定方法进行校验,解决了struts1长久之痛。
6、提供了全局范围、包范围和Action范围的国际化资源文件管理实现。
二、Struts2的开发环境搭建:1、寻找开发struts2应用以来的jar文件,至少需要的六个jar文件。
2、编写struts2的配置文件。
3、Struts2在web中的启动。
当filter被读取的时候就会启动配置文件三、struts2中配置的包介绍Struts-default中定义了struts中的一些核心功能,比如拦截器,用来实现文件上传,和数据验证。
四:Action名称的所搜顺序:Htpp://localhost:8080/struts/test/helloword,在默认命名空间的情况下,或者是命名空间为空的情况下可以这样访问Htpp://localhost:8080/struts/test/path2/path1/helloword,五:Action中的各项默认值:如果没有给action配置class,会默认为actionsupport,如果没哟配置method方法,会默认配置action中excute方法,如果没有配置result,也会默认为success。
六:struts视图研究(result各种转发类型):七、Action属性注值当数据经常发生变化时就会采用此种方法八、指定需要struts2处理的请求后缀:默认使用的是.action后缀访问Action,其实可以通过struts.action.extension进行修改的。
开源框架之struts2笔记归纳张慧讲师.doc
======================Day04====================1.回顾1)视图(jsp)到业务控制器(action)数据的传递,为action注入属性eg:在action中有一个user属性,<input type="text" name="ername"/>2)在struts.xml中配置静态的参数,为action注入属性值eg:<action><param name="pageSize">4</param>//action.setPageSize(4)<param name="pageinfo.pageSize">4</param>//action.getPageinfo().setPageSize(4);</action>3)ognl valueStack struts2标签a、struts2运转流程:客户端浏览器提交请求,请求业务控制器,struts2控制器接收到请求,创建valueStack对象,并且把valueStack对象放入request作用域中,接着创建业务控制器action的对象,同时把action对象放入valueStack,控制器调用action的业务方法,默认调用execute,然后由业务控制器action调用模型,模型返回结果给业务控制器action,action接收到模型返回的结果,再把result的name返回给控制器,控制器按照result的配置定位视图(jsp),最后jsp响应给浏览器.在视图(jsp)中使用struts2标签和ognl表达式进行数据的输出.2.valueStack1)valueStack是值栈,是一个栈的结构,是xwork对ognl的封装.2)valueStack在request作用域中,request.setAttribute("struts.valueStack",valueStack)3)在视图(jsp)使用<s:debug/>查看valueStackeg1:<s:property value="user"/>a.首先从request作用域中找到valueStackb.传递ognl表达式user到valueStack中的ognl引擎,ognl引擎进行解析,ognl 引擎到root对象中获取user属性值,并且把值返回.eg2:<s:property value="#user"/>a.首先从request作用域中找到valueStackb.传递ognl表达式#user到valueStack中的ognl引擎,ognl引擎进行解析,ognl引擎到context对象中获取user键所对应的值,并且把值返回.4)struts2如何去支持el,如何去支持request.getAttribute("attr1")a.把request对象类型输出<%=request%><%=request.getClass().getName()%>b.附加源代码,查看实现结论:struts2封装了一个request的类StrutsRequestWrapper,这个类继承了HttpServletRequestWrapper implements HttpServletRequest,struts2在StrutsRequestWrapper中重写了getAttribute(String s),如何重写的:从request的作用域中拿到valueStack,再从valueStack中查找属性名所对应的属性值,再把值返回.在struts2框架整个运转过程中,request对象类型是:StrutsRequestWrapper3.业务控制器action如何访问reqeust,session以及application4.result的常用类型========================Day05======================================== 1.回顾1)什么是MVC:模型、视图、控制器2)什么是struts2:struts2基于mvc设计模式,实现了复杂的mvc控制流程,方便使用者。
struts2笔记
Struts2笔记✧S truts.xml中的配置引用struts标签库<%@taglib prefix="s"uri="/struts-tags"%>Bean配置<bean class="" type="" name = "" scope="" static="" optional="">Type:bean的规范通常是某接口来体现;Scope: bean的作用域default、singleton、request、session、thread;Static:表明bean是否是静态注入,当指定了type属性时,该属性不应该指定为true Optional:指定bean是否是一个可选bean,可选属性。
常量配置<constant name="常量名" value="常量值">命名空间配置●当包制定了命名空间时action的路径为命名空间+action名称●如果在命名空间里找不到action系统会在默认的命名空间查找该action●配置跟命名空间namespace="/"包含配置<struts><include file="struts-shop.xml"></struts>Struts2会在struts.xml中配置多个struts配置文件拦截器配置●拦截器定义<intercepters><interceptor name="拦截器名" class="拦截器实现类"><interceptor-stack name="拦截栈名"><interceptor name="拦截器名" ><interceptor name="拦截器名" ></interceptor-stack></intercepters>●Action中使用拦截器<action name="" class=""><result name=""></result><interceptor name="拦截器名" ></action>Jsp页面中显示action属性(<s:property value="属性名称">)Action访问servletAPI●间接访问ActoinContext ac = ActionContext.getContext();●直接访问Action继承ServletActionContext可直接访问ServletAPI动态方法调用①<fomr action="action名称!方法名称.action" method="">②将指定方法名添加事件例:<input type="button" value="注册" onclick="regist()"/>③实现该方法function regist(){targetAction = document.form[0];targetAction .action = "action名称!方法名称.action";targetAction.submit();}④在action中实现该方法配置action中的method●使用通配符<action name="*_*" method ="{2}" class="{1}"><result name=""> /{2}.jsp</reuslt></action>●当请求中能匹配action的元素,则method=“第二个星号的内容”;class=“第一个星号的内容”结果页面为:第二个星号内容.jsp有完全符合URL请求的配置默认的Action(可显示连接视图)<defult-action-ref name="simpleViewResultAction"><action name="simpleViewResultAction" class=""><result name=""> </reuslt></action></defult-action-ref>Struts2支持多种处理结果类型(<result type="*"></result>)◆plintText类型处理结果(显示试图资源的源代码)<param name="location">/webcome.jsp</param><param name="charSet">/webcome.jsp</param> // 这只显示编码方式◆redirect类型处理结果(包括类型:redirectAction)请求参数、属性都会丢失◆动态结果使用通配符:*◆请求参数决定结果<result > ${参数名}.jsp</result>◆全局结果<global-result></global-result>所有的action都有效,现在本action搜索视图结果在搜全局结果。
struts2学习笔记
struts2 的处理流程: 核心控制器(StrutsPrepareAndExecuteFilter)--->Interceptor--->action---->业务逻辑层--->dao 层
一.struts2 核心文件 struts.xml 的配置
<package name="struts2" namespace="" extends="struts-default"> <action name="sum" class="com.alex.FirstAction"> <result name="positive">/positive.jsp</result> <result name="negative">/negative.jsp</result> </action> <constant name="struts.action.extension" value="jun,lu"/> <!--指定需要 Struts 2 处理的请求后缀,多个之间用逗号分开--> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> <!--关闭动态方法调用。--> <constant name="struts.custom.i18n.resources" value="message"/> </package> 说明:space 声明命名空间。这里和表单提交的要保持一致。例如: namespace="/mystruts" 那么在表单提交的时候应该<s:form action="mystruts/sum.action" > namespace="" 那么在表单提交的时候应该<s:form action="sum.action" > 2.<action name="sum" class="com.alex.FirstAction"> class 便是对应的 Action 类 name 对应 action 的唯一标识。和表单提交时保持一致。例如: name="yj" 那么在表单提交的时候应该<s:form action="yj" > 3.<result name="positive">/positive.jsp</result> 判断跳到哪一个页面,其中 name 是唯一标识。和"com.alex.FirstAction"的返回值进 行对比。相同就跳到相应的页面 4. <constant name="struts.custom.i18n.resources" value="message"/> 配置常量 资源文件--> 1.Action 范围:类名.properties (在国际化的时候,那么就应该是:类名_zh_CN.properties ) //配置一些类型转换错误信息和其他的信息 2.包范围:package.properties 需要放在包下面,只能被该包和子包访问 (在国际化的时候,那么就应该是:package_zh_CN.properties ) 3.全局范围:通过 struts.custom.i18n.resources 来定义全局资源文件,比如在 struts.xml 中配置: <constant name="struts.custom.i18n.resources" value="message"/> 那么全局资源文件就是 message.properties
Struts2学习笔记
struts2学习笔记Struts2 框架第一天今天重点内容: 1、什么是Struts2框架?框架特性分析 2、 struts2 快速入门(分析struts2 运行原理) 3、 struts2 常用配置 4、如何访问Struts2 Action (Servlet) 5、 Struts2 结果集使用(响应跳转/ajax) 1. Struts2 框架概述1.1. 什么是struts2Struts2 框架问题:什么是框架?为什么要学习框架?框架是一些已经写好代码,通常和具体业务无关(可以看成:软件的半成品)学习框架,提高开发效率,简化开发(应用框架,实现代码代码开发实现开发标准化) javaEE三层结构在web阶段 DAO模式符合JAVAEE三层结构的三层结构出自 JavaEE规范(体系结构图)? 表现层? 业务层? 持久层/集成层Struts2 是一个表现层框架(简化表现层代码开发)分层开发:代码结构更加清晰,为了更好维护和扩展1.2. struts2 由来由两个框架优点合并后发展而来(struts1 + webwork)历史由来: Java兴起 98年(最早进行java开发分方向 j2se 、j2ee、 j2me ) J2EE 企业级应用软件开发2000 年左右出现struts1 (几乎所有开发人员都在用)随着互联网的发展struts1设计慢慢开始存有缺陷和不足 Webwork框架的出现该框架的设计思想比struts1 先进的多,例如:引入拦截器机制、 ognl 表达式语言 Apache 推出struts2 框架,特点: 开发流程类似struts1 ,内部结构类似webwork (struts2 和 webwork 源自xwork 命令模式框架)1.3. struts2 开发包结构使用框架,导入jar包课程使用 struts-2.3.15.3-all.zip 版本学习apps 使用demo (方便后期快速导入jar包和配置文件)开发中war重命名成zip包解压找到里面的13个核心jar包 doc 文档(学习struts2的官方官方规范文档) lib 开发struts2 需要的所有jar包 src 源代码开发struts2 没必要导入 lib下 128个jar包(去struts2_blank.war下方找struts2 最基本jar)将war包改为zip 扩展名,解压缩回顾jar记忆: 核心struts2-core-3.15.3.jar+ xwork-core+ognl (3) 上传(2jar) 日志: 2 jar 字符串 lang 1asm.* 3 jar 处理字节码信息 javassist.jar 1 代理相关 freemarker 1 jar 图形模板引擎开发strutrs2 基包导入web 工程!感谢您的阅读,祝您生活愉快。
struts2学习笔记
<result name="fail">fail.jsp</result>
</action>
</package>
</struts>
2.6 部署、运行项目
第三章 访问Servlet API
HttpServletRequest/HttpSession/HttpContext
struts2获取的Servlet API的三个对象都是Map
3.1 与Servlet API 解耦访问
com.opensymphony.xwork2.ActionContext
通过ActionContext类获取Servlet API 对象
构造3个Map对象替代这三种对象
3.1.1 public Object get();方法
ActionContext ac=ActionContext.getContext();
Map request=(Map)ac.get("request");
2.1.2 public Map getSession();
private String username="";
private String password="";
public String execute(){
if(){
return "success";
}else{
return "fail";
struts2学习笔记
doubleName="technology"
doubleList="#foobar[top]"
label="Technology" />
<result>/HelloWorld.jsp</result>
</action>
既可用action名调用该方法了
2)(比较常用)
访问Action时,在Action名后加上“!xxx”(xxx为方法名)。
9:Struts 2.0有两个配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。
listKey="key"
listValue="value"
value='5'
/>
2):这里的key和value的值是一样的(checkboxlist or radio)
<s:checkboxlist
list="{'Red', 'Blue', 'Green'}"
name="favoriteColor"/>
value="{ 'Java', '.Net' }" />
<s:checkboxlist name="skills2"
label="Skills 2"
Struts2笔记
struts21,struts2框架引入到web项目中1.把struts2相关jar包引入到项目中2.把struts2的配置文件直接放到src下面,名字要叫做struts.xml.(运行时配置文件会被框架自动读取).注意:如果struts.xml文件中不能自动提示标签,把相应的dtd文件配置上去.3.在web.xml文件中配置struts2框架的过滤器.这个过滤器的作用:拦截struts2框架中的action.注意:如果不配置这个filter,struts2框架就不能够工作.第一种filter的配置:struts2框架的2.0版本只能使用的方式<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>第二种filter配置:struts2框架的2.0版本以上使用的方式同时2.0版本以上的也可以使用第一种方式.这个过滤器类是2.0版本以上新增的类.<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-cla ss></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>2.struts2框架中的Actionstruts2框架底层还是封装了Servlet的相关内容而实现出来的.只不过struts2框架除了servlet的功能以外还扩展出了很多其他的功能,同时还大大简化了以前在servlet中繁琐的操作.在struts2框架中有一种类就是用代替以前我们在web项目中所使用到的servlet,那么这种类,在struts2框架中被称为Action.所以Action其实也是一种java类,比servlet功能更加强大,同时还比servlet中的操作简单3.为什么Action有比servlet强大的功能和简洁的操作因为我们在web.xml文件中配置了struts2框架中专门的过滤器,用作拦截访问action的请求,拦截住之后,就可以给Action添加很多丰富的功能了.4.如何写一个strtus2框架中的Action三种方式:1,只需要在类中有一个固定的方法:public String execute(){return "...";}不需要实现或者继承任何接口或父类2,实现指定的一个接口:com.opensymphony.xwork2.Action(这个接口中只有一个抽象方法execute()同时还有5个String类型的静态属性:ERROR SUCCESS INPUT NONE LOGIN)3,继承一个指定的父类:com.opensymphony.xwork2.ActionSupport(注意:这种是我们之后一直使用的方式。
struts2笔记总结
Struts2学习问题●Day 01:Struts基本一、Struts2开发基本包(如果是Struts2.2,需要单独下载javassist.jar)xwork-core-2.1.6.jarognl-2.7.3.jarfreemarker-2.3.15.jarcommons-fileupload-1.2.1.jarstruts2-core-2.1.8.jarcommons-logging-1.0.4.jar二、Struts2配置struts-default.xml:默认配置,用于定义Struts2框架提供的Result组件、Interceptor组件。
default.properties:默认配置,用于定义Struts2框架的一些属性struts.xml:开发自定义,用于定义开发者编写的Result组件、Interceptor 组件、Action组件struts.properties:开发自定义,用于覆盖default.properties中的默认配置struts-plugin.xml:整合插件的配置文件注:要注意文件的路径。
两个默认配置文件的位置:struts-default.xml在struts-core-2.1.6.jar包里;default.properties文件在core.jar里的org.apache.struts包里。
自定义的文件放在src目录里。
✓struts-default.xml →定义如下:一系列bean一个package,名字为struts-default,包含很多预定义的Result组件、Interceptor组件。
✓要修改.do还是.action,到default.properties文件里找到相应文件,复制到自定义文件里,写上新值。
如下:struts.action.extension=do三、Action相关配置a)理解package元素的namespace属性的功能注:用命名空间来区别可能出现的相同的action。
Struts2学习笔记-3
Struts学习1.3一、值栈a)struts2中的action是多实例的,每次请求都会创建一个Action的实例b)值栈是存放在request中的一个对象,ValueStack类是值栈的描述类。
c)获取值栈的方法:i.ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack")d)值栈存放对象的方法:i.vs.set("msg","提示信息");e)值栈分为对象栈和Map栈,对象栈的运行原理为:执行时,先把值放置到Map集合中,在把Map集合放置到List[对象栈]集合中二、Ognl表达式的用法a)“ # ”号的用法i.使用ognl表达式获取request、session、application中的值:1.<s:property value="#ername" />2.<s:property value="#ername" />3.<s:property value="#ername" />4.<s:property value="#application['username']" />5.<s:property value="#parameters.cid[0]" />6.<s:property value="#ername" />ii.使用上面的标签解释:1.从Request域中获取username的值-->${ername}2.从Session域中获取username的值-->${ername}3.从Application域中获取username的值-->${ername}4.上面第四个方法等同于第三个方法,只是表现形式不一样罢了5.request.getParameterValues("cid")[0]获取Request提交的所有名称为“cid”的参数,得到的是一个数组,使用[0]取得第0号角标的值6.#ername相当于${username}从四个作用域中依次找名称为username的属性iii.构造Map集合1.<s:radio name="sex" list="#{'male':'男','female':'女'}"></s:radio>b)“ # ”号的用法i.“ % ”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。
Struts2课堂笔记
Struts2部分学习笔记讲师:梁建全liangjq@目录Day01 (5)一、前言 (5)1、为什么要学习Struts框架 (5)2、如何学习Struts框架 (5)二、MVC在JavaWeb程序的使用 (5)1、什么是MVC? (5)2、为什么使用MVC? (5)3、MVC在JavaWeb中的实现 (5)a、原ShoppingCart程序就是一个MVC结构实现 (5)b、ShoppingCart程序虽然基于MVC,但结构还有一些问题 (5)4、Struts2的主要工作流程 (5)三、Struts2框架的历史 (6)四、Struts2框架基本使用 (6)1、Struts2使用步骤 (6)a、下载发布包,将核心包导入web工程 (6)b、配置Struts2控制器,在src下添加struts.xml、Struts2控制器采用的是StrutsPrepareAndExecuteFilter组件实现。
(6)c、根据请求编写Action,DAO,Entity等组件 (6)2、HelloWord示例 (6)Day02 (7)一、Struts2使用基本规则 (7)1、web.xml配置 (7)2、Action编写规则 (7)3、struts.xml中的Action配置 (7)二、实现一个列表显示功能 (7)1、开发步骤 (7)三、OGNL表达式 (8)1、什么是OGNL (8)2、OGNL工作原理 (8)3、OGNL表达式语法 (8)Day03 (9)一、Struts2框架Action组件的核心应用 (9)1、Action组件基本原理 (9)2、如何在Action中使用request,session,application等对象 (9)3、Action属性注入 (10)4、如何利用一个Action处理多个请求 (10)Day04 (10)一、Result组件原理 (10)1、Result组件的作用 (10)2、Result组件实现规则 (10)3、Result组件的使用 (11)二、常用的几种Result组件 (11)1、JSP响应 (11)2、Action响应 (12)3、流响应 (12)4、JSON响应 (12)Day05 (13)一、Struts2标签 (13)1、通用标签 (13)2、表单标签 (13)二、拦截器组件 (13)1、拦截器组件规则add.action(表单数据)--->params (13)a、拦截器组件的作用(工作流程) (13)b、拦截器组件的使用规则 (14)2、掌握自定义拦截器的使用 (14)3、内置拦截器的使用 (15)Day01一、前言1、为什么要学习Struts框架Struts框架是MVC设计模式的实现,基于Struts开发可以简化开发难度,提高开发效率。
Struts2 学习笔记
Struts2 学习笔记---wjt276 [二○一○年一月五日完]目录01 Struts2-Action (5)一、Struts作用: (5)二、搭建Struts2的运行环境: (5)三、Namespace (6)四、<package>标签 (6)五、Action (6)六、路径问题的说明 (8)七、Action的动态调用方法 (8)八、Action通配符(wildcard)的配置 (9)九、Action的属性接收参数 (10)1、在Action添加成员属性接受参数 (10)2、域模型(Domain Model) (10)3、ModelDriven接收参数 (11)十、Action属性接收参数中文问题 (12)十一、简单数据验证 (12)十二、访问Web元素 (14)一、方法一:ActionContext方式 (15)二、方式二:Ioc(控制反转)—推荐使用 (15)三、方式三:获取原类型 (16)四、方式四:获取原类型-控制反转 (17)十三、Struts2配置文件模块化包含(include) (17)十四、默认的Action (18)十五、Action总结 (18)02 Struts2-Result (19)一、Result类型 (type) (19)二、全局结果集(Globle Result) (20)三、动态的结果集(dynamic result) (21)四、带参数的结果集 (21)五、Result总结 (22)六、项目经理: (22)03 OGNL表达式语言 (23)04 Struts2-Tags (28)Struts2标签目录 (28)一、property标签 (28)二、set标签 (29)三、bean标签 (29)四、<include>标签-少使用 (29)五、If elseif else (30)六、Iterator标签 (31)七、Theme (31)05设计约定(编码规定) (32)06 项目开发顺序 (32)07 声明式异常处理 (33)08 国际化 (35)一、国际化资源文件 (35)二、Java国际化 (35)Struts学习笔记第3页共39页三、Struts2国际化 (35)1、Action级别 (35)2、Package级别 (36)3、Application级别 (36)四、资源文件中的参数处理 (37)五、国际化-动态语言切换 (37)09 自定义拦截器 (38)10 类型转换 (38)Struts2总结 (39)目录Action⏹简单数据校验Result常用配置文件OGNL & ValueStackTags---------------------Project⏹类型转换、上传与下载、interceptor、防止重复提交 MVC思想深入剖析源码解读其他话题01 Struts2-Action一、Struts作用:将请求与结果分开二、搭建Struts2的运行环境:1、建立Web项目;2、建立Struts2的配置文件(struts.xml);将Struts2的空项目中的配置文件(struts.xml)复制到项目的src目录下。
Java相关课程系列笔记之十三Struts2学习笔记(建议用WPS打开)
@Struts2学习笔记Java相关课程系列笔记之十三笔记内容说明Struts2(李翊老师主讲,占笔记内容100%);目录一、 Struts2概述 (1)为什么要用Struts (1)什么是MVC (1)JSP Model 1和JSP Model 2 (1)Struts2发展史 (2)衡量一个框架的标准 (2)Struts2使用步骤 (2)内容详解 (3)Struts2提供的方便之处 (4)案例:简单登录(使用Strust2) (4)案例:修改、案例使用户不能绕过前端控制器 (6)NetCTOSS项目:显示资费列表 (6)NetCTOSS项目:资费列表分页显示 (8)二、 OGNL技术 (8)什么是OGNL (8)OGNL基本语法 (8)OGNL表达式中加“#”和不加“#”的区别 (8)OGNL体系结构 (8)XWord框架对OGNL进行了改造 (9)ValueStack对象结构 (9)ValueStack结构演示 (9)Struts2标签的使用 (10)Struts2对EL表达式的支持 (10)案例:修改案例(使用Struts2标签和OGNL表达式) (10)三、 Action (11)Struts2的核心组件 (11)Struts2的工作流程 (11)在Action中访问Session和Application (11)NetCTOSS项目:用户登录 (12)Action属性注入 (13)案例:重构NetCTOSS资费列表分页显示(使用属性注入) (13)使用通配符配置Action (13)案例:通配符配置(资费增、改、查) (14)Struts2中Action的设计经验 (14)四、 Result (15)Result注册配置 (15)Result组件利用<result>元素的type属性指定result类型 (15)常见的Result组件类型 (15)NetCTOSS项目:资费删除 (15)NetCTOSS项目:基于StreamResult生成验证码 (16)NetCTOSS项目:基于JSONResult进行验证码检验 (17)NetCTOSS项目:添加资费模块中的验证资费名是否重复 (19)自定义一个Result (20)五、 Struts2标签 (21)A开头的标签 (21)B开头的标签 (21)C开头的标签 (21)D开头的标签 (21)E开头的标签 (21)F开头的标签 (21)G开头的标签 (21)H开头的标签 (21)I开头的标签 (21)L开头的标签 (21)M开头的标签 (21)O开头的标签 (21)P开头的标签 (21)R开头的标签 (21)S开头的标签 (21)T开头的标签 (21)U开头的标签 (21)所有标签都具备的属性 (21)案例:常用标签 (21)六、拦截器 (21)Struts2详细流程图 (21)拦截器的作用 (21)拦截器的常用方法 (21)自定义拦截器步骤 (21)Struts2内置的拦截器 (21)案例:拦截器入门 (22)拦截器栈 (24)fileUpload拦截器原理 (24)案例:使用fileUpload拦截器实现文件上传 (24)NetCTOSS项目:登录检查拦截器 (25)七、 Struts2中如何处理异常 (25)异常一般出现在何处 (25)如何配置异常 (25)八、 Struts2中如何实现国际化 (25)i18n (25)如何获得中文的Unicode编码 (25)浏览器如何决定用哪个资源文件 (25)资源文件的命名 (25)资源文件的分类 (25)实现国际化的步骤 (25)九、 NetCTOSS项目 (27)DAO优化、重构、封装!【重要】 (27)资费更新 (27)导航条 (27)十、项目经验 (29)主键用int还是Integer (29)“../”表示的意思 (29)导入静态页面,样式、JS失效问题 (29)<s:hidden>和<s:textarea>标签 (29)四种情形下的绝对路径写法 (29)URL和URI (29)和 (29)一、Struts2概述为什么要用Struts1)JSP用HTML与Java代码混用的方式开发,把表现与业务逻辑代码混合在一起给前期开发与后期维护带来巨大的复杂度。
Struts2学习笔记
2010-02-24Struts2学习笔记文章分类:Java编程1.Struts2与Struts1似乎没什么血缘关系了,承自于WebWork,直害WebWork不再推出新版本了,原先的WebWork使用者只需顺其然,即是水道渠成;相反Struts1的开发经验对于Struts2却没有太大的帮助。
2.Struts1的核心控制器是ActionServlet,而Struts2的核心控制器是FilterDispatcher。
Struts2的业务Action会在运行时生成Action代理。
3.Struts1的Action须继承抽象Action类,侵入了Servlet API;而Struts2的Action可以实现ActionSupport,或者只要一个纯净的POJO来充当,完全与Servlet绝缘。
也因此带来测试性Struts2要比Struts1强,可把Struts TestCase扔到一旁去了。
4.Struts1在运行时一个Action只会生成一个实例,而Struts2中的Action会应对每个请求生成新的实例,在线程安全性方面,Struts1要多些考虑。
5.Struts1依靠ActionForm来接受数据,它也是依赖于Servlet API,并非普通的JavaBean,而Struts2可在Action属性中获取请求的属性,当然也能封装在一个独立的POJO中。
不过提醒一下,在Struts1.3中也可以用POJO来接受请求属性,但使用起来有点烦琐。
6.Struts2使用了新的OGNL的表达式语言,可以访问值栈,在对集合和索引属性的支持上功能更强大。
7.Struts1的配置文件只需struts-config.xml;Struts2的配置文件有struts.xml和struts.properties。
struts.properties中有两个struts.devMode=fase和struts.configuration.xml.reload=true很可爱,分别设置当前是开发还是生产模式,以及struts.xml 改变后是否自动重新加载,免去了改配置手工重启应用的必须步骤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts2 框架第三天今天重点内容安排:第一天:struts2 开发流程、访问Action,Action方法调用,结果集类型第二天:获取请求参数,请求数据校验机制,拦截器1、V alueStack 值栈的存储原理和相关操作2、Ognl 表达式语言语法3、struts2 页面控制标签4、struts2 form表单相关标签重点难点:值栈和Ognl1.值栈和Ognl表达式1.1.什么是OgnlOgnl 对象导航图语言Object Graphic Navigation Language,类似EL,比EL ${}语法要强大很多,Struts2框架使用OGNL作为默认的表达式语言必须要引入struts标签库EL Expression Language 表达式语言,用来获取JSP页面四个域范围数据pageContext、request、session、application )Ognl 主要用法:1、访问OGNL上下文值栈对象获取数据(最重要)2、操作集合对象(结合struts2 标签库使用)---- 生成checkbox 、生成select 1.2.什么是值栈ValueStack接口!值栈ValueStack 实际上是一个接口,struts2 Ognl使用都是基于值栈完成的Struts2 内部提供OgnlValueStack的接口实现类,实现了值栈接口!前端控制器每一次请求都会创建一个值栈对象源码:一次请求对应一个值栈对象值栈生命周期= request 生命周期的!!值栈是struts2 一个数据结构,贯穿整个Action实例生命周期(request生命周期),一次请求对应一个Action实例,一个Action实例对应一个值栈实例值栈保存了Action 和其它常用web对象的引用,通过值栈,间接操作这些对象!1.3.值栈的存储结构1:采用标签<s:debug>查看值栈结构图:map Context 结构图2:采用degbug模式查看值栈重要的两个部分结构如图所示:得出结论:值栈包含两个部分:root map⏹CompoundRoot对象,保存Action相关对象--- List结构⏹ContextMap 上下文Map,保存常用web对象引用---- Map结构值栈对象获取两种方式:可以由源码追踪得到:如图:1、request.getAttribute(“struts.valueStack”);2、ActionContext.getContext().getValueStack() ;值栈包括CompoundRoot (对象栈,继承ArrayList)、OgnlContext (ognl上下文,实现Map接口)OgnlContext 上下文,引入CompoundRoot,提供HashMap (values),引用常用web对象1.4.详细分析值栈内部对象的创建和生命周期值栈生命周期,就是request生命周期,一次请求,对应一个值栈实例每次新的请求对应一个新的值栈对象实例! 源码:值栈创建过程源码分析:如果请求资源是jsp静态页面而非action 值栈对象也创建:但是拦截器不起作用!如果访问的是action组件需要注意拦截器会起作用生效!!1、在StrutsPrepareAndExecuteFilter的prepare.createActionContext(request, response);创建ValueStack ,将常用web对象,保存OgnlContext的Map 中2、访问Action ,通过ActionProxy ,调用ActionInvocationDefaultActionInvocation 的init 方法stack.push(action); 将当前Action对象,压入root栈顶部V alueStack 的root 栈存在2个对象,DefaultTextProvider、ValueStackAction(Action栈顶)3、执行ModelDriven 拦截器,判断Action是否实现ModelDriven接口,如果实现了,stack.push(model); 将model压入root栈顶部,root栈三个对象1.5.ognl表达式会执行ValueStack 的findValue 搜索值栈中数据搜索顺序,先搜索Root栈每个对象的属性,如果都没有搜索Map的key直接搜索Map的key ,不会搜索root栈⏹如果访问root (CompoundRoot 对象栈内容),不需要#⏹如果访问Map 内容(request、response、session、servletContext、attr、parameters),⏹需要# 进行访问例如# 相当于request.getAttribute(“name” )1.6.案例演示:值栈存储数据和ognl获取数据1.6.1.值栈中保存基本数据类型(int double String) action 存储数据m1.jsp 获取数据2: 采用set 方法压入栈顶action 代码m2.jsp 页面获取之3: 数据存放在context map 值栈下方数据action 代码:m3.jsp1.6.2.值栈中保存对象数据类型action 存储对象因action 存放值栈对象中所以提供成员对象通过值栈存储页面获取相关数据对象存储除了栈顶之外栈顶对象: 通过属性名获取值!!非栈顶对象valuestack.find(搜索表达式); action 代码m4.jsp页面获取数据1.6.3.值栈中保存集合数据类型(list /map)迭代list集合action代码压入值栈list_map.jsp 页面迭代map存入值栈迭代数组action代码压入值栈页面迭代数据1.6.4.值栈中保存web相关的数据类型用户数据保存request session.....jsp 页面获取这些对象中保存数据通过下方context 对象#key #parameters : 获取请求参数信息request.getParameterMap()=#parameters <,String[]>demo1:#attr 搜索pageContext request valuestack session application 类型EL 按照顺序查找存储数据添加值栈!! attr 搜索的顺序如果上述对象搜索完毕都没有需要数据返回Null 如果找到不找了!!demo2#request request 存储数据demo3#session session 存储demo4action 代码:m6.jsp页面获取相关数据1.6.5.ognl之#号的使用用法一:访问OgnlContext的Map中常用web对象,添加#进行访问#attr 按照page --- request --- session --- application进行搜索Action 代码Jsp代码用法二:不加# 调用ValueStack搜索,先搜索root属性,后搜索Map Action 代码JSP代码用法3:构造Map#{…foo1‟:…bar1‟, …foo2‟:…bar2‟}相当于Map集合对象构造List集合{"睡觉","跑步","洗衣服"}例如:1.7.EL表示式也可以获取值栈数据EL 表达式原理,在pageContext、request、session、application 四个范围,调用request.getAttribute() 获取数据EL可以获取值栈数据引入struts2前端控制器改写request.getAttribute() request 对象做了一个包装重写request.getAttribute() 原来request.getAttribute() 直接从request.setAttribute(存储) 获取数据现在: struts2 getAttribute() 重写: 先去request.getAttribute(key) 找到返回!! 如果找不到返回值null 根据null 继续搜索值栈调用值栈对象findValue(expression) 如果找不到Null 找到返回request 产生变异getAttribute() EL搜索顺序pageContext、request、valueStack session、application阅读StrutsPrepareAndExecuteFilter 源码对requestStruts2 框架提供StrutsRequestWrapper 包装类,对request 的getAttribute 方法增强优先使用request.getAttribute 取值,如果取不到,执行valueStack的findValue方法当堂问题:request.setAttribute(“name“, ”aaa“ ) ;valueStack.set(“name“,”bbb“ )页面<s:property name=”name” /> ----- bbb${name} ------ aaa2.Ognl 表达式语法Struts2 存取数据,通过值栈完成的,Ognl 是访问值栈数据表示式语言语法:% 号用法$ 号用法2.1.%号的使用(jsp页面或者配置struts.xml)“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。
,在表达式添加‘’不会被ognl解析案例:主页面index.jsp编写actin 值栈中存储数据m7.jsp 获取解析数据%{} 将name按照ognl表达式解析%{'name'} 不会按照Ognl解析字符串.2.2.$号的使用$ 在struts2 配置文件【国际化、struts.xml、校验配置文件】中,使ognl表达式被解析${} 语法大括号里面字符当做ognl 表达式自动搜索值栈!!案例一:URL重定向,携带参数案例struts.xml 携带重定向数据${username} 搜索值栈获取数据重定向操作数据携带给后续组件....JSP 获取数据${ername1} = request.getParameter("username1"); 和值栈无关$(username) 搜索pageContext request valuestack session application 搜索key = username案例二:国际化资源文件会${}自动读取相关的信息${} 国际化资源文件xx.properties 自动搜索值栈找寻数据!! 在src新建messages.properties在struts.xml 配置国际化文件必须先执行Action创建值栈,请求转发到JSPm9.jsp页面小结: # % $# : 1: 获取Map 数据#request #attr 2: 构造map 结构参照struts 标签库案例% : %{} 迫使字符串按照ognl表达式解析搜索值栈!%{''} 添加单引号目标字符不按照ognl解析普通字符串或者''$ 国际化资源配置中可以搜索值栈获取值栈对应信息到国际化资源配置信息中显示$ 配置文件中例如:struts.xml 中获取值栈的数据重定向携带数据3.struts2标签库参考:docs/WW/docs/tag-reference.html3.1.关于struts2 UI 相关标签Form Tag 为什么要去应用struts2 form ?⏹数据回显s trus2 标签都可以获取值栈中的数据⏹对页面进行布局和排版(显示样式原理)如果需要对struts2 form标签,设置回显数据值,value属性中%{} 编写OGNL表达式!在struts2 form 标签中,class属性叫cssClass,style属性叫cssStyle3.1.1.<s:form> 表单元素标签3.1.2.textfield, password, hidden<s:textfield> 文本域,生成<input type=”text” ><s:password> 密码域,生成<input type=”password” > <s:hidden> 隐藏域,生成<input type=”hidden” >案例:密码默认showPassword值false ,不回显!3.1.3.submit、reset、label可以设置<s:form> 属性theme (样式),默认样式xhtml ,设置simple设置simple样式后,不会生成<table>标签,form没有样式,需要<s:label> 手动为元素添加标签提示信息3.1.4.textarea3.1.5.radio、checkboxlist、select<s:radio> 接收list或者map 生成一组单选按钮上述如果需要默认选中: 数字和字符的差异需要注意字符需要注意'm'<s:select> 接收list或者map ,生成一组下拉列表checkbox value 表示选中true false fieldVlaue 表示值<s:checkboxlist> 接收list或者map ,生成一组复选框value {'','',''}表示选中的值3.1.6.form主题样式传统表单和struts2表单的对比举例:1: 请求2: action 数据压入栈顶3: form.jsp 回显实现数据回显3.1.7.如何修改主题实际开发使用struts2标签库但是不想使用默认样式排版改写!排版default.properties 框架很多默认配置信息默认样式布局xhtml。