Struts2第二天

    xiaoxiao2021-03-25  99

    Struts2的第二天


    课程回顾:Struts2框架第一天

    1. 概述:WEB层框架,前端控制器的模式 2. 入门程序 3. 配置文件的编写 * 加载的配置文件 * strtus.xml配置文件编写 * 常量的编写 4. Action类的编写方式 5. Action类的访问方式

    Struts2的第二天的内容

    1. Struts2框架中的Servlet的API的使用 2. Struts2中Action接收请求参数 3. Struts2中自定义拦截器

    案例一:使用Struts2作为WEB层完成客户的新增功能


    需求分析

    1. 原来是使用Servlet作为WEB层框架,现在需要使用Struts2作为WEB层完成客户的新增功能

    技术分析之在Struts2框架中使用Servlet的API

    * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的页面上。 * 提供JSP注册的页面,演示下面这三种方式 <h3>注册页面</h3> <form action="${ pageContext.request.contextPath }/xxx.action" method="post"> 姓名:<input type="text" name="username" /><br/> 密码:<input type="password" name="password" /><br/> <input type="submit" value="注册" /> </form> 1. 在Action类中也可以获取到Servlet一些常用的API(实现接口)拦截器实现       2. 完全解耦合的方式 * 如果使用该种方式,Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API * 一些常用的方法如下 * static ActionContext getContext() -- 获取ActionContext对象实例 * java.util.Map<java.lang.String,java.lang.Object> getParameters() -- 获取请求参数,相当于request.getParameterMap(); * java.util.Map<java.lang.String,java.lang.Object> getSession() -- 获取的代表session域的Map集合,就相当于操作session域。 * java.util.Map<java.lang.String,java.lang.Object> getApplication() -- 获取代表application域的Map集合 * void put(java.lang.String key, java.lang.Object value) -- 注意:向request域中存入值。 3. 使用原生Servlet的API的方式(使用的比较多) * Struts2框架提供了一个类,ServletActionContext,该类中提供了一些静态的方法 * 具体的方法如下 * getPageContext() * getRequest() * getResponse() * getServletContext()

    技术分析之结果页面的跳转类型

    1. 结果页面存在两种方式 * 全局结果页面 > 条件:如果<package>包中的一些action都返回success,并且返回的页面都是同一个JSP页面,这样就可以配置全局的结果页面。 > 全局结果页面针对的当前的包中的所有的Action,但是如果局部还有结果页面,会优先局部的。使用的标签是 <global-results> <result>/demo3/suc.jsp</result> </global-results> * 局部结果页面 <result>/demo3/suc.jsp</result> 2. 结果页面的类型 * 结果页面使用<result>标签进行配置,包含两个属性 > name -- 逻辑视图的名称 > type -- 跳转的类型,值一些,需要掌握一些常用的类型。常见的结果类型去struts-default.xml中查找。 * dispatcher -- 转发.type的默认值.Action--->JSP * redirect -- 重定向. Action--->JSP * chain -- 多个action之间跳转.从一个Action转发到另一个Action. Action---Action * redirectAction -- 多个action之间跳转.从一个Action重定向到另一个Action. Action---Action * stream -- 文件下载时候使用的

    技术分析之Struts2框架的数据封装

    1. 为什么要使用数据的封装呢? * 作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中 * 封装数据为开发提供了很多方便 * Struts2框架提供了很强大的数据封装的功能,不再需要使用Servlet的API完成手动封装了!! 2. Struts2中提供了两类数据封装的方式?    静态参数封装拦截器实现 静态参数:指的是通过配置文件配置的方式,给动作类的属性提供值。 明确:     讲解静态参数封装,我们实际开发中用的不多,此处封装不是重点。     我们要通过静态参数封装来了解,我们没有做的事情,功能实现了,不是没人做,是struts2框架提供的拦截器为我们实现的。拦截器很重要,它可以给我们的动作方法进行增强,从而实现一些功能。 动态参数封装拦截器实现 * 第一种方式:属性驱动 > 提供对应属性的set方法进行数据的封装。 * 表单的哪些属性需要封装数据,那么在对应的Action类中提供该属性的set方法即可。 * 表单中的数据提交,最终找到Action类中的setXxx的方法,最后赋值给全局变量。 * 注意0:Struts2的框架采用的拦截器完成数据的封装。 * 注意1:这种方式不是特别好:因为属性特别多,提供特别多的set方法,而且还需要手动将数据存入到对象中. * 注意2:这种情况下,Action类就相当于一个JavaBean,就没有体现出MVC的思想,Action类又封装数据,又接收请求处理,耦合性较高。 > 在页面上,使用OGNL表达式进行数据封装。 * 在页面中使用OGNL表达式进行数据的封装,就可以直接把属性封装到某一个JavaBean的对象中。 * 在页面中定义一个JavaBean,并且提供set方法:例如:private User user; * 页面中的编写发生了变化,需要使用OGNL的方式,表单中的写法:<input type="text" name="user.username"> * 注意:只提供一个set方法还不够,必须还需要提供user属性的get和set方法!!! > 先调用get方法,判断一下是否有user对象的实例对象,如果没有,调用set方法把拦截器创建的对象注入进来, * 第二种方式:模型驱动  是由有个params拦截器为我们实现的,在模型驱动下,需要modelDriven拦截器支持 拦截器实现      > 使用模型驱动的方式,也可以把表单中的数据直接封装到一个JavaBean的对象中,并且表单的写法和之前的写法没有区别! > 编写的页面不需要任何变化,正常编写name属性的值 > 模型驱动的编写步骤: * 手动实例化JavaBean,即:private User user = new User(); * 必须实现ModelDriven<T>接口,实现getModel()的方法,在getModel()方法中返回user即可!! 封装参数失败后的处理方式 非常重要(处理方式必须掌握) struts2框架默认转换的数据类型: 基本数据类型自动转换。 日期类型按照本地格式转换。本地格式:yyyy-MM-dd 西方国家:MM/dd/yyyy 字符串数组会按照逗号+空格的方式拼接成字符串。 关于没有input结果视图的解决: 在对应的动作类配置中配置一个<result name="input">的结果视图 input结果视图的含义:在struts2中就是用于数据回显的。 input结果视图配置的地址:从哪来回哪去 错误信息提示: 需要借助struts2的标签库。<%@ taglib uri="/struts-tags" prefix="s"%> <s:fielderror fieldName=""/>指定哪个字段有错误提示 <s:actionerror/>指定动作方法执行的错误提示 struts2中的国际化: 国际化:I18N internationalization 关于错误信息中文提示的解决: a、在实体类所在的包下创建一个名称为实体类名称.properties的文件 例如:User.java User.properties b、提示内容是根据页面上的错误信息改造的key 英文错误提示:Invalid field value for field "birthday key:invalid.fieldvalue.birthday 例如:invalid.fieldvalue.birthday=\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u751F\u65E5\u683C\u5F0Fyyyy-MM-dd 使用struts2的表单标签实现数据回显: <s:form>:struts2的表单标签 属性: action:请求的地址。它可以省略EL表达式部分和strut2后缀部分 例如: 原始表单:${pageContext.request.contextPath}/register.action struts2表单:register method:请求的方式 它的默认值是post enctype:编码表单的类型(文件上传时用到的属性) namespace:请求地址的名称空间 <s:textfield>:struts2的文本框标签 它就相当于<input type="text"> 属性: name:表示表单元素name属性 label:提示信息。 例子:struts2的表单     <s:form action="register">         <s:textfield name="name" label="用户名" requiredLabel="true" requiredPosition="left"/>         <s:textfield name="age" label="年龄"/>         <s:textfield name="birthday" label="生日"/>         <s:submit value="提交"/>     </s:form>

    数据封装的总结

    1. 属性驱动方式(params拦截器封装) * 把数据封装到某个属性中 * 在目标Action类中定义属性,提供set方法就OK * 把数据封装到JavaBean对象中 * 在目标Action类中定义属性(使用JavaBean),提供get和set方法就OK * JSP页面需要修改,使用OGNL表达式写法,例如:user.username                          2. 模型驱动方式(params+ModelDriven拦截器封装) * Action类必须要实现ModelDriven接口,实现getModel()方法,要返回封装数据的JavaBean的对象 * 在Action类中定义JavaBean属性,必须要手动实例化,例如;private User user = new User();

    技术分析之Struts2把数据封装到集合中

    1. 封装复杂类型的参数(集合类型 Collection 、Map接口等) 2. 需求:页面中有可能想批量添加一些数据,那么现在就可以使用上述的技术了。把数据封装到集合中 3. 把数据封装到Collection中 * 因为Collection接口都会有下标值,所有页面的写法会有一些区别,注意: > <input type="text" name="products[0].name" /> * 在Action中的写法,需要提供products的集合,并且提供get和set方法。 4. 把数据封装到Map中 * Map集合是键值对的形式,页面的写法 > <input type="text" name="map['one'].name" /> * Action中提供map集合,并且提供get和set方法

    案例:添加客户

    1. 功能

    扩展小知识:input逻辑视图

    1. 数据的类型转换Struts2框架已经都完成了!!


    转载请注明原文地址: https://ju.6miu.com/read-14406.html

    最新回复(0)