尚学堂struts2笔记
struts2学习笔记(部分)
1、namespaece(最好用模块的名字命名)Namespace 为空时,用于处理其他package不能处理的全部的action2、Package 用于区分重名的情况3、copy项目的方法及注意事项修改它的启动项引入别人的项目的方法4、action4`1修改文件的默认编码4`2每次访问action都重新new出一个新的对象,不存在同步的问题执行过程4`3Action 继承ActionSupport5、路径:获取系统绝对路径<% String context = request.getContextPath(); %><%String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>使用绝对路径6、ActionMethod动态调用方法7、ActionWildcard通配符使用通配符,将配置量减到最低约定优于配置8、数值传递ActionAttrParamInputDomainModelDrivenModel过程9、中文问题 2.1.6.的bug不能解决中文问题10、11、value stack值栈< s:property value=“Name”/>取值栈中的数值如:< s:property value=“error”/>< s:property value=“[0]Propertyvalue是一个map,name就是key name is error 就是value 13、访问页面元素访问Stack Context中的元素14、include,模块包含15、认Action (好处:访问不存在时自动跳转带默认页)Default-action-ref默认action引用16、result类型1)默认是dispatcher 常用服务器端跳转2)Rdiect 只能是视图不能是action 客户端跳转,最后显示jsp3)Chain ---forwordaction action前不可以加”/”action之间的跳转,最后显示action4)RedirectAction action跳转,最后显示jsp服务器断的跳转:17、Global_ResultExtends =“要继承的包名“Result name属性:18、取value stack中的值动态绑定的。
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学习笔记
1.包头的设置name是struts的包,与Java的包名效果类似,但不是按项目中SRC中包名设置的。
namescape是该包的命名空间。
将作为访问该报Action的路径的一部分。
默认命名空间为namescape=””;假设form 表单提交给helloworld的action ,其action=”/test/helloworld”exctends是表示该包继承的其他包struts_default是任何包都必须继承的包。
否则无法使用struts的核心功能,比如参数上传到action,文件上传,数据校验等。
abstract=”true”定义为抽象包,不得包含Action。
2.action的查找顺序(1)寻找namespace为path1/path2/path3/的包,有这个包:寻找test的Action有这个action:执行没有这个action:寻找namespace为””的命名空间(默认命名空间)是否有这action,没有的话提示找不到action没有这个包:寻找namespace为path1/path2/的包重复(1)步骤。
3.action的默认属性4.Action中各种result的转发类型dispatcher(默认类型)redirect(重定向)redirectAction (重定向到新的Action)plainText (显示原始文件内容)result转发还可包含参数,该参数取自Action中的属性。
例:<action name=”login” class=”xxxx.xxx.xxx.sdsds”><result name=”sucess”> /aaa.jsp?username=${ssss}</result></action>其中ssss是login这个Action中所必须具有的属性redirect书写格式1.<result name=”sucess” type=”redirectAction”>login</result>该写法只能访问位于同一包中的Action;2. <result name=”sucess” type=”redirectAction”><parma name=”actionname”>login</parama><parma name=”namespace”>/xxxxx</parama></result>该写法可访问位于其他包的ActionplainText书写格式1.<result type=”plainText”>/login.jsp</result>2. <result type=” plainText”><parma name=”location”>/login.jsp</parama><parma name=”charSet”>UTF-8</parama></result>全局转发只能在包内定义全局转发。
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课堂笔记2
一:Struts2标签库
2. Generic Tag
二:OGNL
值栈的含义正如它的名字所表示的那样——对象所组成的栈。
OGNL的全称是Object
Graph Navigational Language(对象图导航语言),提供了访问值栈中对象的统一方式。
它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
几个概念
1. ActionContext: ActionContext是Action上下文,可以得到request session application
一次Action调用都会创建一个ActionContext
调用:ActionContext context = ActionContext.getContext()
2. ValueStack: 是值栈存放表单中的值
由OGNL框架实现, 可以把它简单的看作一个List
3. Stack Object:放入stack中的对象,一般是action。
Stack Context stack上下文也是用来存值的
Stack Context(map):stack上下文,它包含一些列对象,包括request/session/attr/application map等。
Struts2第一天课堂笔记
一、框架概述1、框架的意义与作用:所谓框架,就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多的经历放到业务需求的分析和理解上面。
特点:封装了很多细节,程序员在使用的时候会非常简单。
2、三大框架:Struts2,Hibernate,Spring3、学好框架:由于框架中细节很多,知识点比较零散,课后总结和做好笔记就变得尤为重要。
二、关于三层架构三、控制器:MVC中的控制器1、MVC回顾M:Model 模型,封装数据。
javabeanV:view 视图,展示界面。
jspC:Controller 控制器,控制程序流程。
Servlet2、Servlet和FilterServlet:Filter:总结:Servlet能做的事情,过滤器也可以做到。
并且过滤器比Servlet还多了一个放行的功能,因此过滤器比Servlet功能更为强大。
结论就是:过滤器同样也适合做控制器。
四、案例中的问题规律:1、获取请求正文,用户要做什么事情2、根据不同的请求,做出不同的判断3、执行具体的方法代码(动作)4、转向页面,展示给用户缺陷:1、重复性劳动太多,具体的执行代码也有冗余代码。
2、到底要做什么全是硬编码,像用户要做什么事情,对应执行什么代码,可以写在配置文件中。
3、具体的代码方法放到了控制器中,过于臃肿。
五、Struts2简介1、Struts2概述Struts2是Apache发行的MVC开源框架。
注意:它只是表现层(MVC)框架。
2、Struts2的来历Struts1:也是apache开发的一套mvc的开源框架。
在2005年之前非常流行。
弊端:Struts1的核心控制器就是一个Servlet。
随着使用者的增多,弊端开始出现。
Struts2:在long long ago,有一个设计超前的框架XWork,后来推出了XWork1和WebWork2。
Struts2就是apache和OpenSymphony 组织合并开发出来。
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课堂笔记一、环境配置1、下载struts2所需包()2、解压空项目(apps/struts2-blank)3、复制项目中的web.xml(WEB-INF文件夹中),并修改web.xml起始默认页4、复制项目中lib(WEB-INF文件夹中)下面的所有包5、复制项目中的struts.xml(WEB-INF\classes文件夹中),留下xml的定义头、struts和package标签,其他的全部删除6、配置struts.xml的提示,window-references-xml Calalog-addLocation:struts-2.3.dtd所在路径(struts-2.3.3\src\core\src\main\resources)Key Type:URIKey:/dtds/struts-2.3.dtd7、新建action可以继承ActionSupport类或实现Action接口8、配置struts.xml,package标签中增加action标签,指定name属性(该属性为必填属性,别名的作用),可以指定class属性(class为选填属性,表示别名对应的action类)9、jsp页面可以直接使用上面配置的action的name属性值了(一般使用范围:form的action,a标记的href)二、struts.xml配置1、参考struts-2.3.3\src\core\src\main\resources\struts-2.3.dtd配置2、参考struts-2.3.3\src\core\src\main\resources\struts-default.xml配置result-types:action中结果类型的配置(很少用)interceptors:拦截器定义(下节重点)default-interceptor-ref:声明默认拦截器引用(下节重点)default-action-ref:声明默认actiondefault-class-ref:声明默认的classglobal-results:全局返回结果(常用于登陆或出错了)global-exception-mappings:全局异常处理action:action的配置(此节重点介绍)<action name="..." class="..." method="...">-action中方法名为execute时,此处method可以省略配置<result name="..." type="...">-action返回值为success时,此处name可以省略配置<param name="...">...</param></result></action>type:掌握chain,dispatcher(默认),redirect,redirectAction,stream内部转发(chain,dispatcher)重定向(redirect,redirectAction)跳转页面(dispatcher,redirect)跳转action(chain,redirectAction)三、校验框架校验execute方法(方法执行顺序:validate-execute)1、在action中编写validate方法2、如果验证出错了可以用:this.addFieldError("...","...");或this.addActionError("...");或this.addMessage("...");来增加错误提示3、前台JSP页面可以用<s:filederror filedName="..." />或<s:actionError />或<s:message />或EL表达式(${errors[0].name})4、如果action中增加错误,则action中的execute方法是不会执行的,并且会自动返回input,所有在struts.xml中配置action的时候一定要配置返回结果为input的类型校验自定义方法(方法执行顺序:validate-validateTest-test)1、如自定义方法名为test,则增加validateTest方法实现校验2、其他步骤和上面execute方法的校验一样3、注意事项(自定义校验注意方法名的大小写规范,注意方法的执行顺序)配置校验(action名-validation.xml)参考xwork-core-2.3.3.jar下的com.opensymphony.xwork2.validator.validators下的default.xml文件配置提示(见第1章):struts-2.3.3\src\xwork-core\src\main\resources\xwork-validator-1.0.2.dtd验证器说明required:验证非数字是否非空requiredstring:验证字符串字段是否非空int:验证是否为数字long:验证长数字short:验证短数字double:验证小数date:验证日期email:验证邮箱url:验证URL地址stringlength:验证字符串长度regex:验证正则表达式四、拦截器和Action通配拦截器编写与配置(参考struts-2.3.3\src\core\src\main\resources\struts-default.xml配置)1、拦截器编码新建拦截器类,实现Interceptor接口或继承AbstractInterceptor抽象类2、拦截器的定义在struts.xml中增加<interceptors>标签(参考第2章struts.xml配置)在<interceptors>标签中增加<interceptor name="..." class="...">标签3、拦截器栈的定义在<interceptors>标签中增加<interceptor-stack name="...">标签在<interceptor-stack name="...">标签中添加拦截器的引用(参考第4点)4、拦截器的引用在<action>标签下增加<interceptor-ref name="...">标签引用配置好的拦截器或拦截器栈5、默认拦截器增加<default-interceptor-ref name="...">标签引用拦截器或拦截器栈6、拦截器的执行顺序action中的拦截器-默认拦截器-继承的拦截器7、struts2提供的拦截器defaultStack:struts2提供的拦截器(配置了自定义拦截器之后,一定要把默认的拦截器加上,否则会导致struts2的很多功能无法使用)Action通配(*)配置Action的时候要注意约束规则(包括大小写)<action name="*_*" class="com.zit.action.{1}Action" method="{2}"><result><param name="location">{1}{2}success.jsp</param></result><result name="input"><param name="location">{1}{2}.jsp</param></result></action>提交的action别名:student_addaction类名:com.zit.action.studentActionmethod方法名:add成功页面:studentaddsuccess.jsp失败页面:studentadd.jsp五、OGNLOGNL表达式(<s:debug>标签的应用)1、Value Stack(可以直接访问,例:<s:property value="name" />)2、Action Context(访问时候需要加#号,例:<s:property value="#" />)掌握的三个符号#(1.访问非值栈的内容2.构造Map集合3.投影())%(和javascript中的eval用法类似)$(EL表达式所用)六、标签库需要掌握的标签:<s:property><s:date><s:debug><s:if><s:elseif><s:else><s:iterator><s:form><s:textfiled><s:password><s:hidden><s:radio><s:checkboxlist>七、上传下载上传文件1、编写页面代码参考struts2-core-2.3.3.jar\org.apache.struts2.interceptor\FileUploadInterceptor.class代码<form action="upload" method="post" enctype="multipart/form-data"><input type="file" name="file" /><input type="submit" value="上传" /></form>2、编写Actionpublic class UploadAction extends ActionSupport {//待上传的文件private File file;//文件名,注意命名private String fileFileName;//文件类型,注意命名private String fileContentType;@Overridepublic String execute() throws Exception {//获取项目所在根目录下的upload文件夹String path=ServletActionContext.getServletContext().getRealPath("/upload");//定义输入输出字节流InputStream is=null;OutputStream os=null;try {//指定待上传的文件is=new FileInputStream(file);//指定上传之后存放的路径os=new FileOutputStream(path+"//"+fileFileName);byte[] b=new byte[1024];int len=0;while((len=is.read(b, 0, 1024))>0){os.write(b, 0, len);}} catch (Exception e) {e.printStackTrace();}finally{os.close();is.close();}return SUCCESS;}//省略getter/setter}3、配置struts.xml<action name="upload" class="com.zit.action.UploadAction"><result><param name="location">index.jsp</param></result></action>配置上传文件限制大小(默认2M)参考:struts2-core-2.3.3.jar\org.apache.struts2\default.properties在package标签上面增加<constant name="struts.multipart.maxSize" value="2097152"></constant>,改变value值配置上传文件的临时存储空间<constant name="struts.multipart.saveDir" value="c://temp"></constant>上传文件注意事项:1、前台页面表单一定要修改属性enctype="multipart/form-data"和method="post"2、如果要使用多文件上传,修改上面action代码为数组类型(File[],String[]),下面用循环即可下载文件1、编写页面代码<form action="download" method="post" id="myform"><input type="hidden" name="name" id="myfile" /></form><s:iterator value="list" var="s"><div class="show" onclick="getName('<s:property value="s" />');"><s:property value="s" /></div></s:iterator>function getName(name){var myform=document.getElementById("myform");var myfile=document.getElementById("myfile");myfile.value=name;myform.submit();}2、编写Action代码public class DownLoadFileAction extends ActionSupport {private String name;public InputStream getInputStream() throws Exception{String path=ServletActionContext.getServletContext().getRealPath("/upload");return new FileInputStream(path+"//"+name);}public String getName() throws Exception {//转换编码return URLEncoder.encode(name,"utf-8");}public void setName(String name) { = name;}}3、配置struts.xml参考:struts2-core-2.3.3.jar/org.apache.struts2.dispatcher/StreamResult.class<action name="download" class="com.zit.action.DownLoadFileAction"><result type="stream">//${name}一定要和前台JSP中传递过来的名字保持一致<param name="contentDisposition">attachment;filename=${name}</param>//此参数的名字一定要和Action中的方法名保持一致,如:inputStream,action 中一定要有个方法叫做getInputStream<param name="inputName">inputStream</param></result></action>下载注意事项:1、下载文件编码问题(用post提交请求)2、配置文件和后台action的对应3、下载的时候配置文件中的结果类型要用stream。
struts2学习笔记
7. Struts1 的配置文件只需 struts-config.xml;Struts2 的配置文件有 struts.xml 和 struts.properties。struts.properties 中有两个 struts.devMode = fase 和 struts.configuration.xml.reload = true 很可爱,分别设置当前是开发还是生产模式,以及 struts.xml 改变后是否自动重新加载,免去了改配置手工重启应用的必须步骤。
Struts2 学习笔记(四)
1. 按这个顺序加载 Struts2 的常量,struts-default.xml、struts-plugin.xml、struts.xml、web.xml;后加载的会覆盖前面的同名常量。强烈不推荐在 web.xml 中配置 Struts2 常量。
2. Struts1 中有一种 Action 类型是 ForwardAction,而在 Struts2 中相应的配置方式是 <action name="Showcase"><result>/showcase.jsp</result></action>,Showcase.action 直接映射到 /showcase.jsp。
3. Struts1 的 Action 须继承抽象 Action 类,侵入了 Servlet API;而 Struts2 的 Action 可以实现 ActionSupport,或者只要一个纯净的 POJO 来充当,完全与 Servlet 绝缘。也因此带来测试性 Struts2 要比 Struts1 强,可把 Struts TestCase 扔到一旁去了。
Struts2学习笔记
</action>
</package>
要访问other()方法,可以通过这样的URL访问:/test/helloworld_other.action
9.OGNL
Struts2将应用范围里的数据以及Action处理的数据都存储在一个区域里。在Struts2中叫做值栈,valueStack。
OGNL就是从值栈中取出自己数据,并在某些条件下进行数据过滤和计算的表达式语言。先入后出。
OGNL中如果搜索的数据不是值栈里存储的数据,而是其他对象,特别是Struts2的ActionContext中的对象,则在访问
这些对象的时候,前面要加上“#”。
价格小于50元的建材
<s:iterator value="materials.{?#this.mainbid<50}">
<s:property value="materialName" />建材的价格是<s:property value="materialValue" />元!
</result>
当多个action中都使用到了相同视图,这时我们应该把result定义为全局视图。struts1中提供了全局forward,struts2中也提供了相似功能:
<package ....>
<global-results>
<result name="message">/message.jsp</result>
struts2学习笔记2
Struts学习1.2一、类型转换a)可以继承DefaultTypeConverter或StrutsTypeConverter类,也可以直接实现TypeConverter接口b)直接实现TypeConverter接口(这里不对该方法进行着重理解)i.需要重写下面的方法convertValue(Map<String,Object> context, Object target, Member member, StringpropertyName, Object value, Class toType)c)继承DefaultTypeConverter类i.需要重写下面的方法convertValue(Map<String,Object> context, Object value, Class toType) ii.该方法的返回值就是Action类中的属性的值iii.参数value---String[]要转化的值,该值是字符串类型的数组,strus2底层用request.getParameterValues("属性名")iv.参数toType要转化的数据类型,这里是java.util.Date.class类型d)实现思路i.在上面的方法中判断value是否为空,并且length是否大于0,如果两个条件都满足,如果两者有一个不满足就返回nullii.再判断toType是否为空,如果为空则返回null,如果不为空,则要判断一下是否是我们要转换的类型(toType!=java.util.Date.class)如果不是,则返回nulliii.如果上面两个值都不为空,并且length也大于0,则开始判断value是否是String[](value instanceof String[])如果这个条件为true,我们再执行iv.遍历value字符串数组,开始我们的转换v.最后需要编写一个properties资源文件,该文件放置到和当前Action同一个包下,内容是:Key Value要转换的目标类型当前转换器所在的完整类路径二、文件上传a)首先我们知道Struts2中是利用apache上传组件来完成的文件上传功能,Struts2对该组件又进行了一次封装,所以用起来更加灵活,方便,简单b)主要的三个字段(提供getter和setter方法):i.[File Name]:File类型,通常是HTML页面中input的name属性的值,保存上传的临时目录下的文件---------File - the actual Fileii.[File Name]ContentType:String类型,必须是HTML页面中input的name属性的值+ContentType,保存了上传文件的类型---------String - the content type ofthe fileiii.[File Name]FileName:String类型,通常是HTML页面中的input的name属性的值+FileName,保存了上传文件的真实名称---------String - the actual name ofthe file uploaded (not the HTML name)c)有了以上的三个段,我们可以用ServletContext对象获取上传文件保存的目录i.ServletContext realPath =ServletActionContext.getServletContext().getRealPath("/upload");ii.通常apache上传组件中的IO包里的FileUtils工具类,利用该类下的copyFile()方法,我们可以将临时文件复制到实际目录下iii.copyFile(File srcFile, File destFile)该方法有两个参数,参数一:源文件,我们这里是三个主要字段的第一个FileName;参数二:该参数要一个File对象,我们可以这样写(new File(realPath ,[File Name]FileName))里面的第一个参数是要保存文件的目录,我们通过ServletContext获取到的,第二个参数是三个主要字段的第三个(真实的文件名称)d)最后上传成功后,再将保存的临时文件夹下的临时文件删除掉i.代码:[File Name].delete();e)配置Struts.xmli.在Action中要配置两个结果:<result name="success">/upload/success.jsp</result><result name="input">/upload/error.jsp</result> ii.其中第一行,表示程序运行成功时,转到success.jsp;第二行表示程序运行失败时,转到error.jspiii.更改临时文件的存放目录<constant name="struts.multipart.saveDir"value="D:/temp"></constant>iv.配置上传文件的总开关,这里的配置对当前web应用的所有的上传都有效,默认上传大小是2M<constant name="struts.multipart.maxSize"value="222097152"></constant>v.以上的配置是对全局生效的方式,以下来看一下对局部生效的方式:f)更改文件上传失败的提示:Key Valuestruts.messages.error.uploading 上传失败: {0}rge 文件太大: {0} "{1}" "{2}" {3}struts.messages.error.content.type.not.allowed 内容类型不允许: {0} "{1}" "{2}"{3}struts.messages.error.file.extension.not.allowed 扩展名不允许: {0} "{1}" "{2}" {3} 三、自定义拦截器a)要定义自定义拦截器,需要实现Interceptor接口,重写里面的三个方法,三个方法分别为:init()、intercept(ActionInvocation invocation)、destroy()这三个方法代表了拦截器的生命周期b)参数ActionInvocation: 代表一个给定动作的执行状态, 拦截器可以从该类的对象里获得与该动作相关联的Action对象和Result对象,在完成拦截器自己的任务之后,拦截器将调用ActionInvocation对象的invoke方法前进到Action处理流程的下一个环节 ActionInvocation:封装了程序运行上下文信息,[action result...]c)如:获取一些上下文的信息i.获取当前Action名称:invocation.getProxy().getActionName()ii.获取命名空间:invocation.getProxy().getNamespace()iii.获取当前方法:invocation.getProxy().getMethod()iv.获取代理对象:invocation.getProxy()d)在Struts.xml中配置拦截器i.在对应的包下申明一个<interceptors></interceptors>ii.在上面的<interceptors>标签内添加:<!--name属性:自定义拦截器的唯一名称--><interceptor name="limit" class="自定义拦截器完整类路径" /><!--name属性:自定义拦截器栈的唯一名称--><interceptor-stack name="limitStack"><!--name属性:把默认栈添加到自定义栈中--><interceptor-ref name="defaultStack"/><!--name属性:把自定义拦截器添加到自定义栈中--><interceptor-ref name="limit"/></interceptor-stack>iii.在<interceptors>标签后添加引用:<default-interceptor-ref name="limitStack"/>四、表单验证a)代码方式进行表单验证i.要利用Struts2中的内部机制来完成表单验证,需要在当前访问的Action类中重写validate()方法ii.在该方法中对需要验证的字段进行判断,如果不符合条件,则使用this关键字,调用addFieldError()方法,该方法有两个参数,第一个添加进去的字段名,用于在JSP或其它地方取值,第二个参数要一个字符串类型的提示语。
struts2课堂笔记(第一天)
八、 基于注解的struts2 开发
知识结构(原理及流程------>所有配置文件----->重点配置文件(struts.xml)----------->常量配置(还有Action)------>
Action类的编写------>action中方法调用-------->动态方法调用--------->ServletAPI获取三种方法
今天所学:
一、框架概述
二、Struts2开发快速入门
三、struts2 运行流程分析
四、 struts2 常见配置(配置文件加载顺序,struts.xml常用配置,常量配置)
五、 Action的访问(Action的三种编写方法,详细配置Action , 动态方法调用)
六、在Action中使用Servlet API
四、 struts2 常见配置
学习路径
1)、 struts.xml常量配置(配置文件顺序)、Action访问(Servlet API)、结果集 (使用Struts2 编写简单案例)
2)、 请求数据
3)、 响应页面生成
1、 struts2 配置文件的加载顺序
struts2 配置文件 由核心控制器加载 StrutsPrepareAndExecuteFilter (预处理init(),执行过滤)
init_DefaultProperties(); // [1] ---------- org/apache/struts2/default.properties
init_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xml
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学习笔记
1.15、23__Struts2_模块包含2.<struts>3. <constant name="struts.devMode" value="true" />4. <include file="login.xml" />5.</struts>6.可以将别的写好的配置文件直接包含到struts得配置文件中,方便多人开发避免不必要的配置文件冲突.7.login.xml8.<?xml version="1.0" encoding="UTF-8" ?>9.<!DOCTYPE struts PUBLIC10. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"11. "/dtds/struts-2.0.dtd">12.13.<struts>14. <package name="login" extends="struts-default" namespace="/login">15. <action name="login*" class="er.action.LoginAction{1}">16. <result>/user_login_success.jsp</result>17. </action>18. </package>19.</struts>20.21.16、24__Struts2_默认Action22.<package name="default" namespace="/" extends="struts-default">23. <!-- 当配置文件中没有用户要访问的Aciton的时候,会调用<default-action-ref 所定义的Action --处理错误页面-->24. <default-action-ref name="index"></default-action-ref>25. <action name="index">26. <result>/default.jsp</result>27. </action>28. </package>29.30.17、27__Struts2_结果类型_result_type_131. ResultType的最常用的几种配置:(四种配置分别代表了四种不同的跳转方式)32. <package name="resultTypes" namespace="/r" extends="struts-default">33. <action name="r1">34. <!--type不写默认的为dispatcher:用服务器跳转跳转到结果页面--只能跳转到页面,不能跳转到Action -->35. <result type="dispatcher">/r1.jsp</result>36. </action>37.38. <action name="r2">39. <!--客户端跳转的方式跳转到结果页面只能跳转到页面,不能跳转到Action -->40. <result type="redirect">/r2.jsp</result>41. </action>42.43. <action name="r3">44. <!--服务器跳转的方式跳转到Action -->45. <result type="chain">r1</result>46. </action>47.48. <action name="r4">49. <!--客户端跳转的方式跳转到Action -->50. <result type="redirectAction">r2</result>51. </action>52.<!--当要跳转的Action在别的包下的时候应该这样写-->53. <action name="r5">54. <result type="china">55. <parma name="actionName">dashboard</param>56. <parma name="namespace">/sesure</param>57. </result>58. </action>59.60.18、30__Struts2_Global_Results_全局结果集61. <package name="user" namespace="/user" extends="struts-default">62. <!-- 配置全局的结果集:当返回的result没有配置的时候会执行全局结果集的配置-->63. <global-results>64. <result name="mainpage">/main.jsp</result>65. </global-results>66.67. <action name="index">68. <result>/index.jsp</result>69. </action>70. </package>71.<!--关键字extends的使用:我想在下面的这个配置包中使用上面那个包中的结果集,那么可以使用extends关键字继承上一个包72.<package name="admin" namespace="/admin" extends="user">73. <action name="admin" class="er.action.AdminAction">74. <result>/admin.jsp</result>75. </action>76. </package>77.78.17、31__Struts2_动态结果集_dynamic_result79.可以在strtus.xml文件中动态的指定返回的结果集。
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课堂笔记
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内容比较多,比较杂。
多做实验,证明结论,增加印像。
一、Struts2概述1、是什么?Struts2是一个M(模型---域--范围模型)V(View视图)C(控制器)框架(模型2)。
框架都是一个半成品。
提高开发效率。
Struts1是一个MVC框架,非常流行。
有很大的缺点。
此时一个webwork的框架设计超前,名气不是很大。
Struts1+webworkd=struts2。
用的是struts1的名字,但是与sruts1没啥关系,struts2的核心是webwork框架。
2、能干什么?web开发主要干的工作:获取请求参数封装到JavaBean验证和转换调用业务代码存数据转向某个页面展示结果表现层的开发技术。
(背景色为蓝色区域)二、搭建struts2的开发环境1、下载地址:2、解压后的目录结构:a)apps:框架本身提供一些案例(学习)b)docs:框架本身提供的文档(指南和API)。
不保证100%正确c)lib:框架需要的jar包及第三方的jar包(不要全拷贝)d)src:源码搭建步骤:a、新建一个JavaWeb工程b、拷贝struts2运行所需的必要jar包。
(方便办法:struts2发行包\apps\struts-blank.war,拷贝其中的lib下的所有jar)struts2-core-2.3.1.1.jar:Struts 2框架的核心类库xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基于xworkognl-3.0.3.jar:对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性reemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写commons-logging-1.1.x.jar:ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
this.application = session.getServletContext();
}
然后由request.setAttribute("r1", "r1")设值。
13.模块包含
在struts.xml中可以将其他xml文档包含
然后action类中持有一个领域模型的对象的引用,在url中同样可以传参数直接对领域模型对象的属性赋值,
写法为 namespace/actionname!method?domainmodel.parameter=XXX&domainmodel.parameter=XXX,
(也可能是method?domainmodel.parameter.parameter.parameter=XXX,此时domainmodel成员变量为另一个对象,
18.带参数的结果集。
由于forward服务器内跳转共享一个值栈,所以参数也共享,即没有必要传。
而再redirect客户端重定向的时候,值栈不共享,是两次request过程,
此时希望action向新定向到的页面传参数需要使用?paramname=${paramname}
即<result type="redirect">/user_success.jsp?t=${type}</result>
也可以在url地址中动态指定(动态方法调用DMI)(推荐)
前者会产生太多的action,所以不推荐使用
6.使用通配符,将配置量降到最低
不过,一定要遵守"约定优于配置"的原则,即命名规则统一。
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
·redirectAction 重定向到一个action
·freemarker
·httpheader 发一个http的头信息
·stream 下载
·velocity
·xslt xml的修饰
·plaintext 页面源码
·tiles 页面分块后动态指定
假如chain forward调转的action在包内
●Action
1.struts2的作用就是让用户请求和返回视图(servlet api)分离。
space决定了action的访问路径,默认为"",可以接收所有路径的action
namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,
或者实现Action接口
不过最常用的是从ActionSupport继承,好处在于可以直接使用Struts2封装好的方法
4.struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
虽然可以用redirect方式解决,但redirect方式并非必要。
然后再jsp中使用<s:property value="r"/>接受参数。
●result
15.result的type(类型)属性
·默认为dispatcher 运用jsp跳转(forward)到结果页面 不能跳转到action
·redirect 重定向到结果页面 不能跳转到action
·chain forward跳转到一个action
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
得到map类型的 request,session,application.
还可以通过put方法对这些名值对进行赋值。
<package name="admin" namespace="/admin" extends="user">
则此包内拥有user包的action
17.动态结果集 即<result>${r}Байду номын сангаас/result>,此时r为action的成员变量
r的值可以动态指定为一个字符串,例如"/user_success.jsp"。
可以观察ValueStack里保存的action中的属性。
属性都是存在map中的,有值,有名,而 值,是个数组,
所以我们用<s:property value="[0]">可以取到错误信息的具体字符串。
12.
一、
后台程序可以通过ActionSupport中的方法
request = (Map)ActionContext.getContext().get("request");
7.使用action属性接收参数,在URL地址中传的参数和action里的成员变量可以是一一对应的,
action初始化时,会自动将成员变量的值初始化成参数的值。(struts调set方法,所以set方法名
和url参数的名必须匹配而真正的成员变量名不一定非要匹配)
8.使用Domain el(领域模型)接收参数 action类中可以不写具体的属性而将其写入领域模型中,
session = request.getSession();
application = session.getServletContext();
然后由request.setAttribute("r1", "r1")往进设置值。
四、
同样设置三个成员变量
private HttpServletRequest request;
<s:fielderror fieldName="name" />将带有简单格式的提示信息打印到前台
首先,在前台页面中包含<%@taglib uri="/struts-tags" prefix="s" %>
在META-INF下struts-tag.tld中有标签详细信息 页面中使用<s:debug></s:debug>
然后调用put方法,往进写东西。
三、
同样设置三个成员变量 但类型不同
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
然后初始化
request = ServletActionContext.getRequest();
则 <result type="chain">
<param name="actionName">adfadf</param>
<param name="namespace">/XXXXXX</param>
</reuslt>
在struts-2.2.1.1-docs/struts-2.2.1.1/docs/chain-result.html可查
同样设置三个成员变量 但使用范型
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
然后设置set方法,由struts将页面元素对象自动设置进去(实现RequestAware,SessionAware,ApplicationAware),
<include file="XXXX.xml" />
这样的好处是,多个模块可以同时开发,然后包含就可以协作工作。
14.默认action
在url的namespace后什么都不敲入或敲入不存在的action时,访问默认的action
<default-action-ref name="index"></default-action-ref>
16.global-results全局结果集在,同一个package中大家可以共用的结果视图
<global-results>
<result name="mainpage">/main.jsp</result>
</global-results>
其他package中也想使用此package的result,则extends="packagename"
在2.1.6之前,中文问题是个BUG,在2.1.7中已修正。
11.使用struts的标签来将程序中对用户的提示信息打印到前台页面:
在后台 使用this.addFieldError("name","name is error");其中name为action中的属性,
"name is error"为错误信息的提示
在前台页面,可以通过