java课件04框架struts22action详解_第1页
java课件04框架struts22action详解_第2页
java课件04框架struts22action详解_第3页
java课件04框架struts22action详解_第4页
java课件04框架struts22action详解_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

Struts2第二章、Action详解本章节授课目标Struts2Action详细Action类如何定义和使用Action类如何接收前台提交数据内容Action类如何访问ServletAPIAction类如何访问非原生SevletAPI如何访问自定义方法如何返回多个结果2Struts2

Action类介绍3Struts2ActionStruts2的Action类作为MVC框架的控制器,用来对请求做出逻辑处理,然后返回一个处理结果指令。4如何编写Struts2Action类?编写一个Struts2Action类有以下几种方式:编写普通的java类,不继承任何类,不实现任何接口。编写实现com.opensymphony.xwork2.Action接口的类,实现其中的publicStringexecute()throwsException方法。编写继承自com.opensymphony.xwork2.ActionSupport类的子类,重写publicStringexecute()throwsException方法。尽管不是必须使用第二种或第三种方式编写Action类,但是为了提高开发效率往往选择使用继承自ActionSupport的方式来编写Action类。5Action接口Action接口定义Action接口定义了5个常量字符串,一个方法,详细代码见PPT备注6Action接口Action接口为了简化编程,定义了5种最常使用的action处理结果名称常量字符串。定义了一个execute方法,无参数,返回值类型String类型7ActionSupport类ActionSupport类增加了更多web编程时需要使用到的方法,例如处理数据校验的方法定义等等。完整代码见PPT备注8ActionSupport类使用继承自ActionSupport类的方式编写Action类可以让我们获得很多的处理web编程的方法,如处理数据校验错误的方法,增加输出提示信息的方法等等。建议在一个struts2项目中定义一个公共Action基础类,指定ActionSupport为父类,然后使用项目内自定义的这个公共基础类作为所有Action类的基类。9Struts2

Action详解之处理输入数据10接收用户输入的几种方式在Struts2.0中有如下几种方式可以获得用户输入信息,采用的都是IOC的方式,具体方式如下:使用action类的属性接收用户输入使用领域对象接收用户输入使用ModelDriven的方式接收用户输入在action类中直接定义属性与前台表单中的输入项同名即可。在action类中使用POJO,前台表单中的输入项名称为“POJO变量.属性名称”的方式定义。实现ModelDriven接口,实现TgetModal()方法。11Action属性方式使用Action属性方式接收前台输入数据直接在Action类中定义属性,生成get和set方法。在前台表单中定义输入项的name属性值与Action类中定义的属性同名。示例:publicclassLoginActionextendsActionSupport{privateStringuserName;privateStringuserPass;<s:formaction="login"method="post"theme="simple"><s:textfieldname="userName"></s:textfield><s:textfieldname="userPass"></s:textfield><s:submitvalue="提交"></s:submit></s:form>与Action类属性同名12Action属性方式示例通过用户登陆示例演示定义Action属性接收前台输入数据1.定义action类,选择从ActionSupport类继承方式。2.在Action类中定义两个属性,分别代表前台输入的用户名和密码,生成get和set方法。3.定义前台登陆页面login.jsp,确定输入项名称与Action属性同名。4.重写execute方法做登陆逻辑判断,成功或失败返回不同的处理结果字符串指令。5.配置struts2配置参数文件,定义action,定义结果名称及跳转页面名称。示例代码见PPT备注13请思考Struts2编程中采用这种方式获取前台输入数据简化了哪些步骤?传统编程中如何取的输入数据?通过request.getParameter读取,然后再做数据类型转换。一个表单中有多少个字段就要写多少行读取输入数据的代码。Struts2框架中如何取得的?方式一的情况下,按照框架要求定义前台输入项目名称时和Action属性同名即可。还有其它的方式帮助我们简便的获取前台输入数据。14使用领域对象取得输入数据方式二:使用领域对象(POJO)获取前台输入对象实际工作中要处理的用户输入项可能很多,一般我们是按照DAO方式定义一个实体类来保存用户输入,在Action类中直接使用实体类定义变量,然后将输入数据自动填充到实体类变量中的方式就是领域对象方式。示例:15使用领域对象方式示例示例:学生信息录入编程1.编写代表学生信息的实体类(POJO)Student类,定义学生相关的各种属性,生成get和set方法。2.在Action类中使用Student实体类定义变量,生成get和set方法。3.在前台学生信息录入界面,定义输入项名称为“实体类变量名称.属性名称”4.在提交数据到服务器端Action类中以后,直接使用实体类变量即可访问前台输入的数据了。示例代码见PPT备注16领域对象获取输入数据要点前台输入项的name属性特殊注意即可,定义名称为实体类.属性名称的方式。实体类(POJO)的属性要有get和set方法。实体类(POJO)要有无参数的构造函数。Action类中使用实体类定义变量时也要生成get和set方法。使用实体类的方式接收输入数据可以减少Action类中的代码量,另外实体类实例可以传递给DAO层使用。17ModelDriven的方式取输入数据方式三:可以使用实现ModelDriven接口的方式直接使用领域对象字段接收前台输入数据。示例:Action类代码JSP页面代码片段18ModelDriven的方式示例演示使用实现ModelDriven接口的方式处理前台数据输入示例代码见PPT备注19ModelDriven方式小结优点1.更加精简了Action类中的代码。2.需要Action类实现ModelDriven接口。3.需要定义实体类的实例时即时实例化。4.前台输入项不需要带有实体类实例的名称了。缺点如果前台输入的数据需要分别向两个以上的实体类实例保存就无法实现了。20三种方式的比较如果网页前台向服务器端输入的数据项不多,可以考虑直接使用定义Action类属性的方式,此方式不适合处理大量的输入字段的情况,会让Action代码比较乱,另外数据的复用性差,不便于在DAO等其它层面使用。领域模型方式接收前台输入需要额外的定义一个领域模型对象类,另外即使前台的页面中要写死实体类实例名称。ModelDriven方式同样需要定义领域模型对象,但是前台无需带有实体类实例名称。但是这种方式无法处理多个领域对象的数据保存问题。21Struts2

Action详解之访问ServletAPI22Struts2与servlet技术Struts2框架提供了两种方式访问ServletAPI:IOC方式非IOC方式ServletAPI的表现形式也分为两种:原生ServletAPI对象与J2EE技术无关的伪ServletAPI对象在Action类中实现特定的接口,然后定义特定类型的变量,框架会自动为变量注入实例。通过使用com.opensymphony.xwork2.ActionContext类。23原生Servlet对象与非原生对象Struts2框架在设计时就考虑到了单元测试问题,传统的Servlet技术无法进行单元测试,因为需要Servlet环境。为了避免与ServletAPI耦合在一起,方便Action类做单元测试,Struts2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest、HttpSession、ServletContext对应的Map对象来保存和读取数据。要获得这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类。尽可能的多用MAP类型的伪Servlet对象去操作。24访问原生Servlet对象IOC方式访问原生对象Action类实现ServletRequestAware和ServletContextAware接口,由Struts2框架向Action实例注入HttpServletRequest和ServletContext对象。示例:publicclassDemoActionextendsActionSupportimplementsServletRequestAware,ServletContextAware{privateHttpServletRequestrequest=null;privateServletContextservletContext=null;privateHttpSessionsession=null;@OverridepublicvoidsetServletContext(ServletContextcontext){servletContext=context;}@OverridepublicvoidsetServletRequest(HttpServletRequestrequest){this.request=request;session=request.getSession();}IOC方式调用这些方法。25访问原生Servlet对象非IOC方式访问原生对象可以使用org.apache.struts2.ServletActionContext类取的原生Servlet对象。示例:publicclassDemo1ActionextendsActionSupport{@OverridepublicStringexecute()throwsException{ HttpServletRequestrequest=ServletActionContext.getRequest();HttpServletResponseresponse=ServletActionContext.getResponse();HttpSessionsession=request.getSession();ServletContextapplication=ServletActionContext.getServletContext(); returnSUCCESS;}26访问非原生Servlet对象IOC方式访问Action类实现特定的接口以后就可以访问伪Servlet对象。示例publicclassDemo2ActionextendsActionSupportimplementsRequestAware, SessionAware,ApplicationAware{ privateMap<String,Object>application; privateMap<String,Object>session; privateMap<String,Object>request; @Override publicvoidsetApplication(Map<String,Object>application){ this.application=application; } @Override publicvoidsetSession(Map<String,Object>session){ this.session=session; } @Override publicvoidsetRequest(Map<String,Object>request){ this.request=request; }}27访问非原生Servlet对象示例:演示代码中向Map类型的非原生对象存入数据,在前台JSP页面中可以从原生对象中读取获得。示例代码见备注28访问非原生Servlet对象非IOC方式访问非原生Servlet对象可以使用com.opensymphony.xwork2.ActionContext类来访问非原生Servlet对象。示例@OverridepublicStringexecute()throwsException{ActionContextcontext=ActionContext.getContext();Maprequest=(Map)context.get(“request”);//获得request对象

Mapsession=(Map)context.getSession();Mapapplication=(Map)context.getApplication();request.put(“user”,“admin”);//将user值放到request作用域中

session.put(“user”,“admin”);//将user值放到session作用域中

application.put(“user”,“admin”);//将user值放到application作用域中

returnSUCCESS;}29访问非原生Servlet对象非IOC方式示例注意观察Action类中使用的是非原生对象。示例代码见备注30Struts2

Action详解之方法调用31自定义Action方法在之前的授课过程中,当客户端请求触发Action类代码的执行时,总是执行的execute方法,是否允许一个Action类定义其他的方法供客户端调用呢?Struts2框架要求能够被客户端调用的方法定义有特殊的定义格式要求,必须为以下方式:publicStringxxxx()[throwsException]public访问权限String类型的返回结果类型无参数可选的抛出异常32自定义Action方法自定义Action方法的其它要求要允许自定义的Action方法被客户端调用,需要在Struts2的配置参数文件中进行配置定义。配置方法<actionname=“xxx”class=“xxx”method=“自定义的方法名称"></action>关于Action配置参数以后会详细讲解33自定义Action方法自定义Action方法完整示例Action类代码publicclassDemo4ActionextendsActionSupport{ privateStringstr; publicStringsayHello(){ str="hello!"; returnSUCCESS; } publicStringgetStr(){ returnstr; } publicvoidsetStr(Stringstr){ this.str=str; }}自定义的方法名称34自定义Action方法自定义Action方法完整示例struts.xml配置参数片段,完整的见PPT备注…<packagename="default"namespace="/"extends="struts-default"><actionname="demoAction4"class="com.shinowit.Demo4Action"method="sayHello"><resultname="success">/dispHello.jsp</result></action></package>…必须明确的指出要调用哪一个方法35自定义Action方法自定义Action方法完整示例前台数据展示dispHello.jsp文件,完整代码见备注<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@taglibprefix="s"uri="/struts-tags"%>….<body><s:textname="str"></s:text></body>…36Struts2

Action详解之多个返回结果37多个返回结果每个Action方法都需要返回一个字符串类型的结果,当Action方法中返回不同名称的处理结果指令时通过配置struts2参数文件可以跳转到不同的View层上。示例publicclassMultiResultActionimplementsAction{@OverridepublicStringexecute()throwsException{if(ServletActionContext.getRequest().getParameter("id")!=null){return"success";}else{return"error";}}}有两种不同的结果名称38多个返回结果Act

温馨提示

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

评论

0/150

提交评论