版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
资 基 Struts2运行环境和安装说明 实 创建Struts2工 拷贝基础包到工 Struts2在Action中 只需用到 获得 Struts2的SStruts2表单 Struts2返回 Struts2返回 使用 Struts2验证框 创建xml内 Struts2 Struts2资ApacheStruts2OpensymphonyXWork/xworkOpensymphonyWebWorkStruts2运行环境和安装说明struts-VERSION-all.zip是完全版struts-VERSION-lib.zip是必要库版2.1 Struts2Struts1Struts2=WebWork对比配置文件:Struts1配置文件放在WEB-INF/struts-config.xml(可定制)下;Struts2的配置文件要放在WEB-INF/classes下控制器:Struts1的控制器是一个ActionServlet类;Struts2动作表单:Struts1的HTML表单对应一个ActionForm类的实例,动作类可对应配置的ActionForm,操作ActionForm进行填充数据传输对象;Struts2的HTML表单直接映射成POJO,动作类中可直接POJO,操作对POJO的验证。何一个POJO,但是最好是继承ActionSupport类?。JSPStruts2OGNL来显示各种对象模型,JSP自带JSTLELEL常用来补充表单库?。为什么最好是继承ActionSupport类?Struts2的具体有哪些ActionSupport类的作用struts2不要求我们自己设计的action类继承任何的struts基类struts接口,但是我们为了方便实现我们自己的action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的publicStringexecute()throwsException方法。因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。Struts2中通常直Action来封装HTTP请求参数,因此,Action类里还应该包含与请求参数对应的属性,并且为属性提供对应的gettersetter方法。Struts2的具体有哪些:详见Struts2工程Struts2到 找到struts-\apps\struts2-blank-.war解压在web.xml中添加Struts2的过滤器(2.0和2.1的过滤器不同<!--<!--Struts2.1--<filter-name>struts2</filter-<filter- <filter-name>struts2</filter-<url-pattern>/*</url-</filter- <!--Struts2.0--<filter-name>struts2</filter-<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-<filter- <filter-name>struts2</filter-<url-pattern>/*</url-</filter- 拷贝基础包到工程--freemarker-2.3.15.jar--模板引擎包commons-fileupload-1.2.1.jar--文件上传包拷贝struts.xml(struts2-blank-\WEB-INF\src\java)到 <!--关闭动态方法调用关闭action名+感叹号+方法名进行方法调用<constantname="struts.enable.DynamicMethodInvocation"value="false"<constantname="struts.devMode"value="false"<includeextends继承参数,必须要有个.<package o" o"extends="struts-<!--name为 名称--<action oWorld" 写Action类(可以不继承任何类,也可以继承publicoActionprivateString默认执行方法publicString{System.out.println("world:"+//SUCCESS是result即result中没有写name, returnpublicpublicString{return}publicvoidsetMessage(String{this.message=}}Action接口,里面定义了一些返回的字符串常量(SUCCESS,INPUT,ERROR...),execute方法.ActionSupport类,Actioin接口的默认实现 oWorld.jsp页面,message参<%@<%@taglibprefix="s"uri="/struts-tags"<!-- <h2>Message:<s:propertyoAction,带message参数 Struts2在Action中只需用到ActionContextctx=ActionContext.getContext();ctx.put("request","request");Map<String,Object>session=ctx.getSession();session.put("session","session");Map<String,Object>appliction=代码获得HttpServletRequestHttpServletRequestrequest=ServletActionContext.getRequest();HttpServletResponseresponse=ServletActionContext.getResponse();HttpSessionsession=request.getSession();ServletContextservletContext=接口获得如果有多个Action需要用到request,可以写个Action继承接口,使用request的Action继承再它/*/*继承ServletRequestAware(获得request),ServletResponseAware(获得response),ServletContextAware(获得ServletContext),SessionAware(获得Session)接口*/publicclassFormActionimplementsServletRequestAware,ServletResponseAware{privateHttpServletRequestrequest;privateHttpServletResponseresponse; publicvoidsetServletRequest(HttpServletRequest{this.request=}publicvoidsetServletResponse(HttpServletResponse{this.response=}}//Struts2//Struts2中默 的是Action中execute方中的execute方法publicString{return}(只要在url中指定方法名称就可以了.如:要oAction中的add()方法url:(加!和方法名字struts.xml中配置可以关闭动态方法(默认是激活,可能会让用户方法没有公开的方法,最好不用)--><constantname="struts.enable.DynamicMethodInvocation"value="false" 配置多个方<!--FormAction中的add<actionname="userActionAdd"class="com.struts2.form.FormAction"<!-- FormAction<actionname="userActionUpdate"class="com.struts2.form.FormAction" 使用通配符调用多个<!-name="*_*"class="com.struts2.form.{1}Actionmethod="{2}"url:user_list.action就是调用userAction中list方法.method="{2}"->list(第二个*对应的字符串method="{3}"->abd(第三个*对应的字符串--<actionname="userAction_*"class="com.struts2.form.FormAction"
默认类型,FreeMarker的集成把HTTP标头发送回用户重定向到另一个URLRedirectAction(redirectAction)重定向到另一个
把一个InputStream流发送给浏览器( 用于与Velocity技术的集成发送普通文本,通常用来显示JSP页面的<!-<!-Chain用途是构成一条动作链:前一个动作把控制权转交给后一个动作,而前一个动作的状态在后一个动作里仍保持.动作链能不用就不用,有可能把一套连续动作弄成一团乱--<packagename="package1"extends="struts-<actionname="action1"<result<actionname="action2"<result<param<param<packagename="package2"namespace="/namespace2"extends="struts-<actionname="action3"<result<!--或者<result<param<action<result<param<!-<!-重定参数:location:重定向的 表明是否把location参数的值视为一个OGNL表达式来解释,默认值为--<actionname="..."<resultname="success"内部资源<!-外部资源(如果需要使用&和+之类的特殊字符必须使用转义序列.如:&改 转成--<!-<!-重定向到一个参数:actionName:指定重定向Action的名 名空间(没有此参数,与本action同一个命名空间--<result或者<result<param参数<param<param<param<actionname="source_show"<resultname="success" Struts2_OGNL表达Struts2不支持el表达式,只能使用把各种映射关系(一些Map类型的对象)压入OGNL表达式加上一个前缀 Context Object2 数//String[]colorsblue","green","red"}; 长3. 第一个元 List{"a","b","c"}//创建一个由3String构成的4. cities["CA"]或者 cities中key为CA的元 %{}里面的表达式会被求值(%{#request.user.age>40}->trueorfalse,%{1+6}-<p>赋值,取值<!--页面定义变量(本页赋值用name要加#取值),default认值赋值字符串要加'',不然是去Action对应的变量.value="test"->在Action中找test变量--><s:setid="test1"<!--#request.get('javax.servlet.forward.context_path')必须经过转发到jsp才有值,直接jsp无值-- s:<s:propertyvalue="#msg"default="Struts2"/><br/><s:property--<s:if<s:if<div>中年人<s:elseif<div>年轻<p><b>iterator:</b>对集合迭代迭代断是否为<s:if
<s:iteratorvalue="#request.userList"id="u"status="st">index:<s:propertyvalue="#st.index+1"/>&;是否第一个:<s:propertyvalue="#st.first"/>&;是否偶数:<s:propertyvalue="#st.even"/>&;日期<s:datename="#u.birthday"format="yyyy-MM-dd迭代<s:if<s:iteratorvalue="#request.userMap"id="map"status="st">index:<s:propertyvalue="#st.index+1"/>&;是否第一个:<s:propertyvalue="#st.first"/>&;是否偶数:<s:propertyvalue="#st.even"/>&;日期HH:mm:ss"/>&
<p><b>append:</b>对多个集合进行合并合List<s:append<s:param<s:param<s:iteratorvalue="#newList"id="u"status="st">是否第一个:<s:propertyvalue="#st.first"/>&;是否偶数:<s:propertyvalue="#st.even"/>&;<s:datename="#u.birthday"format="yyyy-MM-ddHH:mm:ss"/>&<s:append<s:param<s:param<s:iteratorvalue="#newListMap"id="map"status="st">是否第一个:<s:propertyvalue="#st.first"/>&;是否偶数:<s:propertyvalue="#st.even"/>&;
显示栈里的参数信息Struts2表单<!-<!-action="userAction!%{tip}"动态方法tip为Action中的变量submit--<s:formaction="userAction"namespace="/form"<!--userBean.id为Action中属userBean中id值<s:hidden<s:textfieldname="userB"label="用户名"<s:textfieldname="userBean.age" "<s:textfieldname="userBean.birthday"label="生日"<s:param<!- 不能回<s:passwordname="userBean.password" "<s:textareaname="userBean.des"label="描述"cols="35"<!--这种checkbox显示出来是一行只有一个<s:iterator<s:checkboxname="userBean.likes"label="%{name}"--这种是一行多<s:checkboxlistlist="likeList"name="userBean.likes"listKey="id"listValue="name" <s:selectlist="likeList"listKey="id"listValue="name"headerKey="-1"headerValue="请选 --<!--value="1"设置默认,但是好像设置了不能回填<s:radiolist="#{'1':'男','2':'女'}" "<s:submitvalue="%{tip}"id="submitBut"Struts2文件上传文件上传jsp<s:form<s:formaction="fileAction"namespace="/file"method="POST"<!--name 对应的参数名称--<s:filename="files"<s:filename="files"<s:filename="files"<s:submitvalue="提交用//名称要与jsp中的name相同(三个变量都要get,set)privateFile[]files;//要以File[]变量privateString[]//要以File[]变量privateString[]filesContentType;privateServletContextservletContext;//Action调用的上传文件方publicStringexecute()ServletContextservletContextStringdataDir=servletContext.getRealPath("/file/upload");for(inti=0;i<files.length;i++)FilesaveFile=newFile(dataDir,filesFileName[i]);}return}配置上传文件临时文件夹(在struts.xml中配置<constantname="struts.multipart.saveDir" 文件url<a<a struts.xml配<actionname="fileAction" <!--typestream应StreamResult处<resultname="down"<!-不管实际类型, 文件ContentType统一指定为application/octet-默认为--<!-默认就是inputStream,它将会指示StreamResultinputName属性值getter法比如这里就是getInputStream()来获 文件的内容,意味着你的Action要有这个法--<param<!-默认为 打开),设置为 ent将会告诉浏览 该文件,filename 件保有存时的文件名,若未指定将会是以浏览的页面名作为文件名,如以作为文件名这这里使用的是动态文件名,${fileName},它将通过Action的getFileName()获名--<param <param//Action//Action调用 文件方publicStringdown()return}//获 文件的内容,可以直接读入一个物理文件或从数据库中获取内publicInputStreamgetInputStream()throwsExceptionStringdir=servletContext.getRealPath("/file/upload");Filefile=newFile(dir,"icon.png");if(file.exists()) 文returnnew//和Servlet中不一样,这里我们不需对输出的中文转码为ISO8859-//将内容(Struts2文 测试)直接写入文件 的文件名必须是文本(txt)类//returnnewByteArrayInputStream("Struts2文 测试}return}//对于配置中的${fileName},获 保存时的文件publicStringgetFileName(){StringfileName="图标.png";try{//中文文件名也是需要转码为ISO8859-1,否则乱码returnnewString(fileName.getBytes"ISO8859-1");}catch(UnsupportedEncodingException{return}}Struts21.1.jsonplugin2.struts.xmlpackageextends="json-<packagename="json"namespace="/json"extends="json-3.resultget开头的方法2.struts.xmlpackageextends="json-<packagename="json"namespace="/json"extends="json-3.resultget开头的方法<resulttype="json"user.id属性<resulttype="json"<paramname="includeProperties">user属性<resulttype="json"<paramname="excludeProperties">根对象只包含user<result<paramname="root">需要在配置时指定ignoreHierarchy为false:--><result<param5.5.在action中赋值,返回对应的result在属性get方法上面加@JSON(name="newName")json中的名称@JSON(format="yyyy-MM-dd")格式化日期Struts2////直接调用responseOut方publicvoidresponseOut()throws{StringBuildersb=newsb.append("<?xmlversion=\"1.0\"encoding=\"UTF-8\"?>"); <user //HttpServletResponseresponse=response.setHeader("Cache-Control","no-cache");PrintWriterout=response.getWriter();Struts2////要添加publicclassUserBean{privateLongid;privateStringname;privateStringpassword;privateintage;privateDatebirthday;privateLongsex;privateSet<Long>likes;privateStringdes}publicclassLikeBeanprivateLongid;privateStringname;}publicclass//属性要生成privateStringprivateUserBeanuserBean;privateList<LikeBean>likeList;privateList<UserBean>publicStringlist(){userList=newArrayList<UserBean>();userList.add(newUserBean("abc",19,newDate()));userList.add(newUserBean("def",70,newDate()));userList.add(newUserBean("ghi",40,newDate()));return"list";}//到添加页publicStringlikeList=newArrayList<LikeBean>();likeList.add(newLikeBean(newLong(1),"上网"));likeList.add(newLikeBean(newLong(2),"读书"));likeList.add(newLikeBean(newLong(3),"游戏tip="add";return"info";}//添加方法,Struts2会自动把对应的值赋值给userBeanpublicStringadd(){return"toList";}publicStringtoUpdate(){likeList=newArrayList<LikeBean>();likeList.add(newLikeBean(newLong(1),"上网"));likeList.add(newLikeBean(newLong(2),"读书"));likeList.add(newLikeBean(newLong(3),"游戏tip=System.out.println("updatename:"+userBean.getName());userBean=newUserBean("update",100,newDate());userBean.setId(newLong(101));userBean.setSex(newLong(2));userBean.setDes("Struts2用户");Set<Long>likes=newHashSet<Long>();likes.add(newLong(2));likes.add(newLong(3));return"info";}//更新方publicStringreturn"toList";}//删除方publicStringSystem.out.println("delname:"+userBean.getName());return"toList";}}struts.xml<packagename="form"namespace="/form"extends="struts-<!--使用通配符调用多个方法,method为*对应的字符串--><actionname="userAction_*"class="com.struts2.form.FormAction"<!--方法返回的字符串对应name,再转发到页面--><result<result<!--重定向Action,可以有Action名字和空间,参数--><resultname="toList"<!--空间参数,不写代表和当前Action同一个空<param--jspjsp<!--重定向Action的名称--><param<!--url带的参数,${userB}是动态参数,值为Action的属性userBean中name的值--><param<paramlist(列表页面<!--<!--添 --<%@taglibprefix="s"uri="/struts-tags"<div><ahref="${pageContext.request.contextPath}/form/userAction_toAdd.action">添加断用户是否为空<s:if<div>用户列表<!--遍历用户--><s:iteratorvalue="#request.userList"id="u"<s:property <s:property <s:property <!--格式化日期--><s:datename="#u.birthday"format="yyyy-MM-dd href="${pageContext.request.contextPath}/form/userAction_toUpdate.action?userB=${>修改 href="${pageContext.request.contextPath}/form/userAction_delete.action?userB=${>删除</a><div>无用户info.jsp(添加和修改页面<!--<!--添 --<%@taglibprefix="s"uri="/struts-tags"<!--显示标记(添加/修改)<s:property<!--action="userAction_%{tip}"tip为Action中的标记变量submit不加method<s:formaction="userAction"namespace="/form"<!--userBean.id为Action中属性userBean中id的值--><s:hidden<s:textfieldname="userB"label="用户名"<s:textfieldname="userBean.age" "<s:textfieldname="userBean.birthday"label="生日"<s:paramname="value"><s:datename="userBean.birthday"format="yyyy-MM-<!- <s:passwordname="userBean.password" "<s:textareaname="userBean.des"label="描述"cols="35"<!--这种checkbox显示出来是一行只有一个<s:iterator<s:checkboxname="userBean.likes"label="%{name}"--这种是一行多个<s:checkboxlistlist="likeList"name="userBean.likes"listKey="id"listValue="name"label="<!--<s:selectlist="likeList"listKey="id"listValue="name"headerKey="-1"headerValue="--value="1<s:radiolist="#{'1':'男','2':'女'}" "<s:submitvalue="%{tip}"id="submitBut"Action置中一定要设置input回页面添加验证只要创建验证的xml文件Actioninput返回页面添加验证只要创建验证的xml文件创建xml文件名Action同包下,创建:Action类名-如:ValidateAction创建ValidateAction-<!--每<!--每个方法单独配置一个Action--><!--在Action同包下,创建:Action类名-action方法配置名称-validation.xml--><actionname="validateAdd"class="com.struts2.validator.ValidateAction"<!--要创建ValidateAction-validateAdd-validation.xml-->通配符配置<!--在Action同包下,创建:Action类名-action方法对应的名称-validation.xml--><actionname="validate_*"class="com.struts2.validator.ValidateAction"<!--要创建ValidateAction-validate_add-validation.xml,validate_add 这个action方法的路径--注注意要验证的方法不能叫这样配置在form表单中要在<s:formaction="validate_add">中action写好名称,不能写action="validate_",然后<s:submitvalue="提交"method="add"/>这样会找不到对应的配如果验证出错,返回input页面时,那些存在ValueStack中的值会丢失,可以将Action实现Preparable接口,然后prepare()方法里初始化添加页面需要的值.如果使用Preparable接口,必须在action配置中添加<interceptor-refname="paramsPrepareParamsStack"这样prepare()才能得到form提交的参创建xml内容<!DOCTYPEvalidatorsPUBLIC<!DOCTYPEvalidatorsPUBLIC"-//OpenSymphonyGroup//XWorkValidator1.0.2//EN" /xwork/xwork-validator-<!--要验证<!--要验证Action中UserBean的id字段,name="userBean.id"(userBean为Action<field<!--type要验证的类型,short-circuit(默认false),truerequiredstring失败了 就不验证了.--<!--field-validator下面可以有多个param元素,但是最多只能有一个message<field-validator<param<message>Pleaseentera</field-<field-validator Invalid</field-Struts内建验证程序(type的值保证字段的值不是空值null.空字符串不是空值<field<field<field-validator<message>Pleaseenterauser</field-param:trim(boolean)->true->去除前后空格<field<field<field-validator<param<message>Pleaseenterauser</field-<field<field-validator<param<message><message>Pleaseentera</field-param:min(int);max(int)<field<field<field-validator<param<param<message>year:1999-</field-<field<field<field-validator<paramname="min">1999-01-<paramname="max">2010-01-<message>birthday:1999-</field-给定的String值是否是一个电子<field<field<field-validator 给定的String值是否是一个合法的URL(要有前缀<field<field<field-validator<message>Invalid</field-验证给定字段是否满足一个OGNL表达式区别 不是一个字段验证程序,失败时将生成一个动作错误.(JSP中调<s:actionerror/>才显示出错信息fieldexpression是一个字段验证程序,失败时将抛出一个字段错误.(对字段验证)param:expression(String)OGNL表达式publicpublicclassExpressionTestAction//属性生成get,setprivateintmin;privateintmax;}<validator<paramname="expression">max>minumtemperaturemustbegreaterthanMinimum<!--jsp--publicpublicclassFieldExpressionTestAction//属性生成get,setprivateintmin;privateintmax;}<field<field-validator<paramname="expression">max>minumtemperaturemustbegreaterthanMinimum</field-publicclassUserBean//属性get,setprivateStringname;privateintage;}//UserBean-validation.xml(和UserBean放在同一个包中<field<field-validator<message>用户名必须</field-<field<field-validator<param<param<message>Agemustbebetween18and</field-//Action的<!--userBean变量名--><field<field-validator<!--message会和UserBean验证中的message一起显示--><message>用户:<</</field-如果另一个Action对UserBean使用另一个标准的验证,可以创建新的验证文件//UserBean-specific-//UserBean-specific-之前的验证不同<field<field-validator<param<param<message>Agemustbebetween30and</field-//另一个Action的<field<field-validator<!--xml中扩展的名字,执行UserBean-specific-validation.xml的验证--><param<message>用户1:</</field-检查对某个属性进行类型转换是否会导致一个转换错误<field<field<field-validatorAnagemustbean</field-验证一个非空的字段值是不是足够的长度<field<field<field-validator<param<param<message><message>length:6-</field-给定的值是否与一个给定的正则表达式匹<field<field<field-validator<param<![CDATA[\d\d\d\-\d\d\d\-Invalidphonenumberorinvalid</field-actionActionSupport类已经实现了这个接口////继承publicclassUserextendsActionSupport//属性privateStringuserName;privateStringprivatestaticList<String>userNames=newArrayList<String>();static{}//验证方publicvoidvalidate() //添加出错信addFieldError("userName","'"+userName+"'hasbeen}}}}自定义验证类要创建一个普通的验证程序(非字段验证程序),扩展ValidatorSupport类.验证失败要从方法addActionError方法要创建一个字段验证程序,扩展FieldValidatorSupport类.验证失败要从validate方法addFieldError方法如果要能接受参数,要在类中定义一个相应的属性,并生 编写publicpublicclassStrongPasswordValidatorextendsFieldValidatorSupport//属privateintminLength=-publicvoidsetMinLength(int{this.minLength=}publicint{return}//验证方publicvoidvalidate(Objectobject)throws{StringfieldName=Stringvalue=(String)getFieldValue(fieldName,object);if(value==null||value.length()<=0){//usearequiredvalidatorforthese}if((minLength>-1)&&(value.length()<{addFieldError(fieldName,}elseif{addFieldError(fieldName,}}privatestaticfinalStringGROUP_1=privatestaticfinalStringGROUP_2="ABCDEFGHIJKLMNOPQRSTUVWXYZ";privatestaticfinalStringGROUP_3=" protectedbooleanisPasswordStrong(String{booleanok1=false;booleanok2=false;booleanbooleanok3=intlength=password.length();for(inti=0;i<length;i++){if(ok1&&ok2&&ok3){}Stringcharacter=password.substring(i,i+1);System.out.println("character:"+character);if{ok1=true;}if{ok2=true;}if{ok3=}}return(ok1&&ok2&&}}xml
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025合资办学合同
- 2025办公用品的长期采购合作合同
- 农村社会实践报告范文
- 超市盘点分析报告范文
- 监理工作总结报告范文
- 课题申报书:高水平大学教学为主型岗位准入与动态转换机制研究
- 上海农林职业技术学院《针织服饰设计》2023-2024学年第一学期期末试卷
- 11葡萄沟 公开课一等奖创新教学设计
- 3《自己之歌》公开课一等奖创新教学设计统编版高中语文选择性必修中册
- 上海南湖职业技术学院《传递过程》2023-2024学年第一学期期末试卷
- 2024年煤矿探放水考试题库附答案
- 矿山安全生产管理经验分享
- 初识旅游智慧树知到期末考试答案2024年
- 2023年中国电动工具行业发展白皮书
- 汉语言文学生涯发展展示
- 盆底功能障碍问卷(PFDI20)
- 期末综合复习(试题)-2023-2024学年五年级上册数学人教版
- 充电桩竞争格局分析
- 线性规划课后题答案
- 压裂作业质量、安全、环保管理体系与措施
- JGJ120-2012建筑基坑支护技术规程
评论
0/150
提交评论