struts2应用开发详解(风中叶)学习笔记.docx_第1页
struts2应用开发详解(风中叶)学习笔记.docx_第2页
struts2应用开发详解(风中叶)学习笔记.docx_第3页
struts2应用开发详解(风中叶)学习笔记.docx_第4页
struts2应用开发详解(风中叶)学习笔记.docx_第5页
免费预览已结束,剩余20页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、 Struts入门和配置1. 下载struts2,到找到struts,下载Full Distribution。2. New Web Project:struts23. 添加struts2的jar包。commons-logging-1.0.4.jar、freemarker-2.3.8.jar、ognl-2.6.11.jar、struts2-core-2.0.11.jar、xwork-2.0.4.jar4. (通过手工启动时需要)在tomcat的server.xml中添加Context,代码如下:5. 新建jsp页面:login.jsp。代码如下:Username:Password:6. 添加web.xml代码如下:struts2org.apache.struts2.dispatcher.FilterDispatcherstruts2/*7. 在src中创建struts.xml(可以在struts2中的app内的项目的class目录中解压拷贝修改)/*name是工程名*/*name是jsp中form的action,而class是action的处理类*/result.jsp/*result的name默认为“success”可以省略*/8. 在com.test.action包中创建LoginAction类public class LoginActionprivate String username;private String password;/setter.geterPublic String execute() throws Exceptionreturn “success”9. 创建result.jspusername:$requestScope.username/*等价*/password:$requestScope.password测试过程中提示:严重: Exception starting filter struts2 nable to load configuration. - bean - jar:file:/./WEB-INF/lib/struts2-core-2.1.8.jar!/struts-default.xml解决:把commons-fileupload.jar 和 commons-io.jar 导入二、 Struts2的类型转换实现例子的验证功能,验证用户名密码是否有填写,用户名密码是否等于要求的值1. 利用标签来实现(struts2的标签定义在struts2.core-2.0.11.jar/struts-2.0.dtd)。创建login2.jsp。代码如下:/*label文本框前面的文字,标签可以自动换行*/2. 修改LoginAction类。(可以查看struts2的文档在struts2/docs/struts2-core/apidocs)public class LoginAction extends ActionSupport .Public void validate()if(null=this.getUsername()|”.equals(this.getUsername().trim()this.addFiledError(“username”,”username required”);if(null=this.getPassword()|”.equals(this.getPassword().trim()this.addFiledError(“password”,”password required”);3. 修改struts.xml。在中添加/login2.jsp4. 进行测试5. 修改LoginAction类中的exectute()代码如下(要把验证的字写前面避免出现“nullPointerException”):if(“hello”.equal(this.getUsername().trim()&”world”.equals(this.getPassword().trim()return “success”;elseThis.addFieldError(“username”,”username or password error”);Return “failer”;6.修改struts2.xml 在中添加/login2.jspStruts2类型转换1. 创建input.jsp。代码如下:(注:如果使用中文需要更改pageEncoding,默认为“ISO-8859-1”,可以修改默认值在preferences-myeclipse-files and editors-jsp:encoding)2. 在com.bean.test包中创建Point类。代码如下:Public classs PointPrivate int x;Private int y;/getter(),setter()3. 在com.test.converter包中创建类PointConverter。代码如下:Public class PointConverter extends DefaultTypeConveterPublic Object convertValue(Map context,Object value,Class toType)If(Point.class=toType)Point point=new Point();String str=(String ) value;String paramValues=str0.split(“,”);Int x=Integer.parseInt(paramValues0);Int y=Integer.parseInt(paramValues1);Point.setX(x);Point.setY(y);Return point;If(String.class=toType)Point point=(Point)value;Int x=point.getX();Int y=point.getY();String return=”x=”+x+” ,y=”+y+”;Return result;Return null;4. 在com.test.action包中创建PointAction类。代码如下:Public class PointAction extends ActionSupportPrivate Point point;Private int age;Private String username;Private Date birthday;/setter,getter()Public String execute() throws ExceptionReturn SUCCESS;5. 修改struts.xml增加一个action代码如下:/output.jsp6. 新建一个output.jsp。Point:Age:Username:Date:7. 在com.test.action中创建PointAperties。(创建转换映射文件)point =com.test.converter.PointConverter三、 Struts2的类型转换续创建多个Point。1. 修改input.jsp。代码如下:2. 修改PointAction类,代码如下:Private Point point2;Private Point point3;/setter(),getter()3. 修改PointApertiesPoint2 =com.test.converter.PointConverterpoint 3=com.test.converter.PointConverter4. 修改output.jsp。代码如下:Point:Point:5.测试对于不同action的转换文件,全局的类型转换文件。1. 在src目录中新建pertiesCom.test.bean.Point= com.test.converter.PointConverter2. 测试用struts的转换类进行转换。1. 在包com.converter.test中创建PointConverter2类。Public class PointConverter2 extends StrutsTypeConverterPublic Object convertFromString(Map context,String values,Class toClass)Point point =new Point();String paramValues=values0.split(“,”);Int x=Integer.parseInt(paramValues0);Int y=Integer.parseInt(paramValues1);Point.setX(x);Point.setY(y);Return point;Public String convertToString(Map context,Object o)Point point=(Point)o;Int x=point.getX();Int y=point.getY();String result=”x=”+x+”,y=”+y+”;Return result;2. 修改perties。Com.test.bean.Point= com.test.converter.PointConverter2利用集合类的Point来实现1. 修改PointAction。去掉以前的Point.代码如下:Private List point;/setter(),getter()2. 修改input.jsp,代码如下:3. 创建转换类PointConverter3,代码如下: Public class PointConverter3 extends StrutsTypeConverterPublic Object convertFromString(Map context,String values,Class toClass)Listlist =new ArrayList();For(String value:value)Point point=new Point();String paramValues=value.split(“,”);Int x=Integer.parseInt(paramValues0);Int y=Integer.parseInt(paramValues1);Point.setX(x);Point.setY(y);List.add(point);Return list;Public String convertToString(Map context,Object o)List list=(List)o;StringBuilder sb=new StringBuilder();dInt number=0;Sb.append(“;For(Point point:list)+number;Int x=point.getX();Int Y=point.getY();Sb.append(number).append(“x=”).append(x).append(“, y=”).append();sb.append(“)”);4. 注释掉全局的转换配置,修改局部的转换配置如下:Point=com.converter.test.PointConverter3四、 Struts2的输入校验验证用户输入的数据是否符合要求。1. 创建一个register.jsp。Username:Password:input type=”password” name=”password”Re-password:Age:Birthday: Graduation: 2. 创建一个Action,叫RegisterAction。Public class RegisterAction extends ActionSupportPrivate String username;Private String password;Private String repassword;Private int age;Private Date birthday;Private Date graduation;/getter(),setter()Public String execute() throws ExceptionReturn SUCCESS;3. 创建一个success.jsp用于显示返回的结果。代码如下:Username:$requestScope.usernamePassword:$requestScope.password.4. 修改struts.xml代码如下:/success.jsp/register.jsp5. 修改RegisterAction。增加方法validate()Public void validate()If(null=username | username.length()10)This.addFieldError(“username”,”username invalid”);If(null=password | password.length()10)This.addFieldError(“password”,” password invalid”);Else If(null=repassword | repassword.length()10)This.addFieldError(“password”,” repassword invalid”);Else If(!password.equals(repassword)This.addFieldError(“password”,” two passwords not the same”);If(age150)this.addFieldError(“age”,”age invalid”)If(null=birthday)this.addFieldError(“birthday”,”birthday invalid”)If(null=graduation)this.addFieldError(“graduation”,”graduation invalid”)If(null!=birthday & null != graduation)Calendar c1=Calendar.getInstance();C1.setTime(birthday);Calendar c2=Calendar.getInstance();C2.setTime(graduation);If(c1.before(c2)this.addFieldError(“birthday”,”birthday should be before graduation”);表单提交出错时,保存原来的信息.遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面类型转换与输入校验的流程1. 首先Struts2对客户端传来的数据进行类型转换2. 类型转换完毕后再进行输入校验3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)注意:如果类型转换不成功,也同样要进行输入校验1.修改struts.xml文件,代码如下:2.在src中创建perties文件。代码如下:Xwork.default.invalid.fieldvalue=0 error3. 测试,如下:由于age是显示表单的名称,所以不是很方便。所以可以提供局部的。4. 在com.action.test中创建RegisterAperties(就是对某个action进行验证后缀为.properties)Invalid.fieldvalue.age=age conversion error测试,如下:利用中文提示:在java-jdk-bin:native2ascii.exe把要转换的中文编译成unicode,比如:invalid.fieldvalue.age=年龄信息输入不正确。在cmd中输入要保存的位置比如D盘:将文件进行转换,比如在D盘的test.txt文件里面的内容为:invalid.fieldvalue.age=年龄信息输入不正确。表单提交出错时,保存原来的信息的第二种方法:利用到struts的标签库(在struts2-core-2.0.11.jar/org/apache/struts2/perties中有个属性:struts.action.extension=action就是我们form表单中的action的扩展名)利用addActionError实现验证信息。1. 在RegisterAction类中修改validate()代码如下:Public void validate()If(null=username | username.length()10)This.addActionError(”username invalid”);.2. 在jsp页面中添加显示的内容:3. 当输入错误信息时显示如下:l 对于struts2标签都有自己排版,如果想自己排版可以在标签的属性theme=”simple”.l 可以通过配置struts.xml来进行逻辑处理。例如:在struts.xml中配置action代码如下:然后可以在RegisterAction中调用abc的方法。对应的验证函数为:validateAbc()对于一个action,执行顺序:validateAbc(),validate(),abc()要改变validateAbc()和validate()顺序,可以把validate改成validateExecute()五、 Struts2的校验框架Struts2提供了一个基于xml的校验框架,信息时fielderror。比如对RegisterAction进行验证。1. 创建RegisterAction-validate.xml。(可以拷贝案例的例子)代码如下可以查看相关的dtd了解更多:/可以查看包中的xwork/com.opensymphony.xwork2.validator.validators/default.xmltrueusername should not be blank!610username should be between $minLength and $maxLength!附:六、 Struts2的校验框架续Struts2同样支持客户端校验1. form的主题(theme)一定不能设定为simple。2. 将form的validate属性设置为true。最好不要使用struts2给我们提供的客户端校验。七、 struts2的核心.拦截器1. 真正存放field级别错误信息的对象是LinkedHashMap2. 该LinkedHashMap的key是String类型的,value是ArrayList类型的3. 对于Action级别的错误信息,实际上是放置在ArrayList中的4 拦截器:Interceptor自己创建一个拦截器的实现机制1. 在包erceptor中创建接口TargetInterface:public interface TargetInterfacepublic void doSomething();2. 在包erceptor中创建一个类Target继承TargetInterface接口:public classTarget implements TargetInterfacepublic void doSomething()System.out.println(“doSomething!”);3. 在包erceptor中创建一个拦截器类Interceptor:public class Interceptorpublic void before()System.out.println(“before”);public void after()System.out.println(“after”);4. 创建处理器类MyHandler 继承InvocationHandler:public class MyHandler implements InvoctionHandlerprivate Object object;private Interceptor interceptor=new Interceptor();public void setObject(Object object)this.object=object;public Object invoke(Object proxy,Method Object args) throws ThrowableObject result=null;interceptor.before();result=method.invoke(object,args);/目标方法interceptor.after();return result;/当目标方法被调用时,会自动调用这个方法。5. 在包erceptor中创建代理类Myproxy:作用是用来产生一个代理:public class MyProxypublic Object getProxy(Object object)MyHandler myHandler=new MyHandler();myHandler.setOject(object);return Proxy.newProxyInstance(Target.class.getClassLoader(),object.getClass().getInterfaces(),myHandler);6. 在包erceptor中创建一个测试类Client:public class Clientpublic static void main(String args)TargetInterface target=new Target();MyProxy myProxy=new MyProxy();TargetInterface proxy=(TargetInterface)myProxy.getProxy(target);proxy.doSomething();7. 执行效果如下:Struts2核心库的源代码是放在struts-2.1.2srccoresrcmainjava路径下,Struts2插件的源代码是放在struts-2.1.2srcplugins插件名srcmainjava路径下,Struts2还需要依赖于XWork的,所以XWork的源代码需要单独下载八、 Struts2的核心.拦截器续拦截器跟过滤器很类似。1. 创建包erceptor。2. 创建MyInterceptor继承Interceptorpublic class MyInterceptor implements Interceptorpublic void destroy()System.out.println(“destroy”);public void init()System.out.println(“init”);public String intercept(ActionInvocation invocation) throws ExceptionSystem.out.println(“intercept”);String result=invocation.invoke();returnresult;3. 在struts.xml中配置:. 4.测试效果如下:没有出现以前的验证效果。只要执行目标方法一次就会拦截一次即执行intercept()一次。struts底层的拦截器是在struts-default.xml中定义的,包括类型转换,输入校验。拦截器栈包含:拦截器或者拦截器栈。默认拦截器栈最多只能有一个。如果在一个action中引进一个拦截器就不会增加默认的拦截器。所以要让新的action有类型转换,输入校验的功能需要引入默认的拦截器。方法一:通过引入系统默认拦截器栈 方法二:通过定义拦截器栈方法三:通过定义默认的拦截器效果如下:引入属性值:在拦截器MyInterceptor中增加属性:private String test;/setter(),getter() 在struts.xml中testvalue1/用于引入拦截器的属性值当然也可以在action中覆盖:testvalue2简化拦截器的定义,通过继承AbstractInterceptor而不是继承Interceptorpublic class MyInterceptor2 extends AbstractInterceptorpublic String intercept(ActionInvocation invocation) throws ExceptionSystem.out.println(“intercept2”);String result=invocation.invoke();return result;拦截器的执行顺序:方法过滤拦截器,具体拦截哪一个方法。1. 创建类MyInterceptor3继承MethodFilterInterceptor:public class MyInterceptor3 extends MethodFilterInterceptorprotected String doIntercept(ActionInvoction invocation) throws ExceptionSystem.out.println(“my intercptor3”);String result=invocation.invoke();return result;2. 在strutsl.xml中配置拦截器:test,execute/必须是includeMethods九、 Struts2的文件上传和下载1. 创建MyListener.java继承PreResultListener在包com.test.listener:public class MyListener implements PreResultListenerpublic void beforeResult(ActionInvocation invocation,String resultCode)System.out.println(“result: “+resultCode);2. 注册到MyInterceptor3中,修改MyInterceptor3:public class MyInterceptor3 extends MethodFilterInterceptorprotected String doIntercept(ActionInvoction invocation) throws Exceptioninvocation.addPreResultListener(new MyListener();System.out.println(“my intercptor3”);String result=invocation.invoke();System.out.println(“after my Interceptor3 finished”);return result;3. 执行效果如下:举例子,利用拦截器来用户校验利用login2.jsp当提交时候页面会跳转到register.jsp,如果用户直接输入register.jsp提交完以后会自动跳转到login.jsp。1. 修改struts.xml的配置:2. 创建拦截器AuthInterceptor类。3修改LoginAction类,把用户信息保存在sessio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论