struts2_day03笔记
- 格式:doc
- 大小:1.60 MB
- 文档页数:53
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的一些优点: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进行修改的。
======================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笔记✧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 框架第一天今天重点内容: 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 工程!感谢您的阅读,祝您生活愉快。
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 开发流程、访问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。