Struts2的第二天


Struts2的第二天的内容

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

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


需求分析

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

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

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

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

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

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

  1. 1. 为什么要使用数据的封装呢?
  2. * 作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中
  3. * 封装数据为开发提供了很多方便
  4. * Struts2框架提供了很强大的数据封装的功能,不再需要使用ServletAPI完成手动封装了!!
  5. 2. Struts2中提供了两类数据封装的方式?
  6. * 第一种方式:属性驱动
  7. > 提供对应属性的set方法进行数据的封装。
  8. * 表单的哪些属性需要封装数据,那么在对应的Action类中提供该属性的set方法即可。
  9. * 表单中的数据提交,最终找到Action类中的setXxx的方法,最后赋值给全局变量。
  10. * 注意0Struts2的框架采用的拦截器完成数据的封装。
  11. * 注意1:这种方式不是特别好:因为属性特别多,提供特别多的set方法,而且还需要手动将数据存入到对象中.
  12. * 注意2:这种情况下,Action类就相当于一个JavaBean,就没有体现出MVC的思想,Action类又封装数据,又接收请求处理,耦合性较高。
  13. > 在页面上,使用OGNL表达式进行数据封装。
  14. * 在页面中使用OGNL表达式进行数据的封装,就可以直接把属性封装到某一个JavaBean的对象中。
  15. * 在页面中定义一个JavaBean,并且提供set方法:例如:private User user;
  16. * 页面中的编写发生了变化,需要使用OGNL的方式,表单中的写法:<input type="text" name="user.username">
  17. * 注意:只提供一个set方法还不够,必须还需要提供user属性的getset方法!!!
  18. > 先调用get方法,判断一下是否有user对象的实例对象,如果没有,调用set方法把拦截器创建的对象注入进来,
  19. * 第二种方式:模型驱动
  20. > 使用模型驱动的方式,也可以把表单中的数据直接封装到一个JavaBean的对象中,并且表单的写法和之前的写法没有区别!
  21. > 编写的页面不需要任何变化,正常编写name属性的值
  22. > 模型驱动的编写步骤:
  23. * 手动实例化JavaBean,即:private User user = new User();
  24. * 必须实现ModelDriven<T>接口,实现getModel()的方法,在getModel()方法中返回user即可!!

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

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

案例:添加客户

  1. 1. 功能

案例总结之Struts2的拦截器技术

  1. 1. 拦截器的概述
  2. * 拦截器就是AOPAspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。)
  3. * 过滤器:过滤从客服端发送到服务器端请求的
  4. * 拦截器:拦截对目标Action中的某些方法进行拦截
  5. * 拦截器不能拦截JSP
  6. * 拦截到Action中某些方法
  7. 2. 拦截器和过滤器的区别
  8. 1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的
  9. 2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
  10. 3)拦截器只能对Action请求起作用(Action中的方法),而过滤器可以对几乎所有的请求起作用(CSS JSP JS
  11. * 拦截器 采用 责任链 模式
  12. > 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链
  13. > 责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行
  14. * struts2 中可以定义很多个拦截器,将多个拦截器按照特定顺序 组成拦截器栈 (顺序调用 栈中的每一个拦截器
  15. 3. Struts2的核心是拦截器,看一下Struts2的运行流程


案例总结之自定义拦截器和配置

  1. 1. 编写拦截器,需要实现Interceptor接口,实现接口中的三个方法
  2. protected String doIntercept(ActionInvocation invocation) throws Exception {
  3. // 获取session对象
  4. User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
  5. if(user == null){
  6. // 说明,没有登录,后面就不会执行了
  7. return "login";
  8. }
  9. return invocation.invoke();
  10. }
  11. 2. 需要在struts.xml中进行拦截器的配置,配置一共有两种方式
  12. <!-- 定义了拦截器 第一种方式
  13. <interceptors>
  14. <interceptor name="DemoInterceptor" class="com.ceobai.interceptor.DemoInterceptor"/>
  15. </interceptors>
  16. -->
  17. <!-- 第二种方式:定义拦截器栈 -->
  18. <interceptors>
  19. <interceptor name="DemoInterceptor" class="com.ceobai.interceptor.DemoInterceptor"/>
  20. <!-- 定义拦截器栈 -->
  21. <interceptor-stack name="myStack">
  22. <interceptor-ref name="DemoInterceptor"/>
  23. <interceptor-ref name="defaultStack"/>
  24. </interceptor-stack>
  25. </interceptors>
  26. <action name="userAction" class="com.ceobai.demo3.UserAction">
  27. <!-- 只要是引用自己的拦截器,默认栈的拦截器就不执行了,必须要手动引入默认栈
  28. <interceptor-ref name="DemoInterceptor"/>
  29. <interceptor-ref name="defaultStack"/>
  30. -->
  31. <!-- 引入拦截器栈就OK -->
  32. <interceptor-ref name="myStack"/>
  33. </action>

案例二:使用拦截器判断用户是否已经登录

Struts2中期(这框架目前正处于淘汰状态)的更多相关文章

  1. Struts2后期(这框架目前正处于淘汰状态)

    Struts2第三天 课程回顾:Struts2框架的第二天 1. Servlet的API * ActionContext对象 * ServletActionContext对象 2. 结构类型的跳转 * ...

  2. Struts2前期(这框架目前正处于淘汰状态)

    Struts2第一天 Struts2的学习路线 1. Struts2的入门:主要是学习Struts2的开发流程(Struts2的开发流程.常见的配置.Action类的编写) 2. Struts2的Se ...

  3. SQL Server 数据库 'xxx' 正处于转换状态。请稍后再尝试该语句。

    问题是这样的,最近因义务需要,公司更换了数据库服务器.数据库随之切换到新的服务器上. 服务器是 Windows Server 2012系统,数据库是SQL Server 2012 .上面有 多个数据库 ...

  4. SQLServer无法删除登录名'***',因为该用户当前正处于登录状态解决方法

    问题描述: sqlserver在删除登录名的时候提示删除失败 标题: Microsoft SQL Server Management Studio -------------------------- ...

  5. 无法删除登录名 '***',因为该用户当前正处于登录状态。 (Microsoft SQL Server,错误: 15434)

    问题描述: 当删除数据库用户时,有时会得到这样的提示: 无法删除登录名 '***',因为该用户当前正处于登录状态. (Microsoft SQL Server,错误: 15434) 解决办法: 1.首 ...

  6. jQuery停止动画和判断是否处于动画状态

    1.停止元素的动画 stop([clearQueue][,gotoEnd]); 参数clearQHCHC和gotoEnd都足町选的参数,为Boolean值(ture或flase).clearQueue ...

  7. 深入浅出Struts2+Spring+Hibernate框架

    一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...

  8. Struts2+Spring+Hibernate框架整合总结详细教程

    一.SSH三大框架知识总结 Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与S ...

  9. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

随机推荐

  1. win+R下的命令

    1.inetmgr 打开IIS 2.taskmgr 打开任务管理器 3.calc 打开计算器 4.msconfig 系统启动配置 5.mstsc  远程桌面 6.systeminfo 查看电脑信息 7 ...

  2. 迟到的UED(转发)

    2013UCAN用户体验设计论坛–精彩视频赏析 - 交互设计 博文 视觉设计 | TaoBaoUEDhttp://ued.taobao.org/blog/2013/09/2013ucan/

  3. 有关satement与preparedstatement

    satement 用于写入数据,例子如下: connection conn=DBHelper.getConnection(); Statement stmt=conn.createStatement( ...

  4. python unix时间戳

    这是第一次用着python感到怒了,从datetime转化到timestamp数值居然没有直接的函数 直接获取当前时间戳倒是方便: import time timestamp = time.time( ...

  5. 【数据库】3.0 MySQL入门学习(三)——Windows系统环境下MySQL安装

    1.0 我的操作系统是window10 专业版 64位.,不过至少windows7以上系统都是一样的. 关于MySQL如何下载,请参考博文: [数据库]2.0 如何获得MySQL以及MySQL安装 h ...

  6. Instance Segmentation入门总结

    前一阵子好忙啊,好久没更新了.最近正好挖了新坑,来更新下.因为之前是做检测的,而目前课题顺道偏到了instance segmentation,这篇文章简单梳理一下从检测.分割结果到instance s ...

  7. monkeyrunner之安卓开发环境搭建(二)

    在上一篇文章-安卓开发环境搭建中,我们创建并启动了eclipse自带的安卓模拟器,该模拟器不仅启动慢,而且在使用过程中的反应速度也是出奇的差,经常出现卡机现象.为了解决这种现象,因此,我们又寻找到了更 ...

  8. 【Leetcode】【Medium】Single Number

    Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...

  9. 时间序列算法理论及python实现(2-python实现)

    如果你在寻找时间序列是什么?如何实现时间序列?那么请看这篇博客,将以通俗易懂的语言,全面的阐述时间序列及其python实现. 时间序列算法理论详见我的另一篇博客:时间序列算法理论及python实现 - ...

  10. 配置环境变量时,cmd下运行java -version,报错:找不到或无法加载主类 -version

    这个方面适用于报错为:java 找不到或无法加载主类,一般是找不到类的路径,问题出在CLASSPATH环境变量上,当然这是大多数.大概率的出错点 不排除根据个人情况不况,所以想起来伟大领袖毛主席的话: ...