资源描述
标题标题标题,第一级,第二级,第三级,*,*,*,第12章,Struts2 基础开发,本课教学内容,Struts2简介,Struts2的基本原理,Struts2的基本使用方法,其他问题,Struts2 简介,大多数框架的版本改进,一般是在原有的基础上增加功能或者进行优化,但是,Struts2和 Struts1 相比,不简单是这样,无论从流程还是结构上,都有很多革命性的改进,Struts2 简介,Struts2 并不是新发布的新框架,而是在另一个非常流行的框架:WebWork 基础上发展起来的。因此,可以说,Struts2 并没有继承 Struts1 的特点,反而和 WebWork 非常类似;换句话说,Struts2 是衍生自 WebWork,而不是 Struts1。正是由于这个原因,Struts2 吸引了众多的 WebWork 开发人员来进行使用。并且由于 Struts2 是 WebWork 的升级,在各种 功能和性能方面都有很好的保证,吸收了 Struts1 和 WebWork 两者的优势,因此也是一个非常优秀的框架,Struts2 简介,Struts2 和 Struts1 具有一些不同点,主要集中在以下方面:,Action 类的编写:,在 Struts1 中,Action 类一般继承基类 org.apache.struts.action.Action。而在 Struts2 中,Action 类可以实现一个 Action 接口,也可实现其他接口,也可以继承 ActionSupport 基类,甚至不需要实现任何接口,只编写 execute 函数即可,Struts2 简介,Action 的运行模式:,Struts1 中,Action 是单态的,系统实例化一个对象来处理多个请求,为每个请求分配一 个线程,在该线程中运行 execute 函数。因此,在开发时需要特别小心,Action 资源必须是线程安全的或同步的。但是,Struts2 中,Action 为每一个请求产生一个实例,不会产生线程安全问题。但是,系统又能够及时回收垃圾资源,不会有废弃空间的问题,Struts2 简介,对 Web 容器的依赖:,Struts1 中,Action 的 execute 函数内,传入了 Servlet API:HttpServletRequest 和HttpServletResponse,使得测试必须依赖于 Web 容器。但是,在 Struts2 中,可以不传入 HttpServletRequest 和 HttpServletResponse ,但是也可以访问它们,因此,Action 不依赖于容器,允许 Action 脱离容器单独被测试,Struts2 简介,对表单数据的封装:,Struts1 中,使 用 ActionForm 来 封 装 表 单 数 据,所 有 的 ActionForm 必 须 继 承 org.apache.strtus.action.ActionForm,有可能造成 ActionForm 类和 VO 类重复编码。但是,Struts2中,直接在 Action 中编写表单数据相对应的属性,可以不用编写 ActionForm,而这些属 性又可以通过 Web 页面上的标签访问,Struts2 的基本原理,环境配置,要编写基于Struts2 的应用,需要导入一些支持的包,也就是Struts2 开发包。这些开发包可以到网上去下载。下载地址为:,Struts2 的基本原理,在 Struts2 中,常用的的组件有:FilterDispatcher 过滤器、JSP、Action、JavaBean、配置文件等。对于一个动作,其执行步骤为:,用户输入,JSP 表单的请求被 FilterDispatcher 截获,Struts2 的基本原理,FilterDispatcher 将表单信息转交给 Action,并封装在 Action 内,Action 来调用 JavaBean(DAO),Action 返回要跳转到的 JSP 页面逻辑名称给框架,框架根据逻辑名称找到相应的网页地址,进行跳转,结果在 JSP 上显示,Struts2 的基本使用方法,导入 Struts2,将如下的几个包拷贝到项目中 WEB-INF 中的 lib 目录下:,编写 JSP,*具体代码示例详见课本,编写并配置 ActionForm,在 Struts1.x 中,必须要单独建立一个 ActionForm 类,而在 Struts2 中 ActionForm和 Action 已经合二为一了。因此,只需要将和表单元素同名的属性编写到 Action 内。Action只是一个普通的类。在包 prj12 内新建一个类:LoginAction.java,编写并配置 ActionForm,LoginAction 没有继承任何类,它有属性 account 和 password,与login.jsp 中的表单元素 account 与 password 必须同名,编写并配置 Action,Struts2 中,既然 Action 和 ActionForm 合二为一,Action 是负责业务逻辑的,所以必须 编写业务逻辑代码。下面来加强 Action 的功能。要能够处理业务逻辑,必须要满足一个规范,那就是:编写 execute 方法来处理业务逻辑。注意,不是重写,是编写。并且该方法不需要有任何的参数,编写并配置 Action,编写 execute 方法,是因为 Action 接收数据后,由框架自动调用它的 execute 方法,该方法的运行,在底层通过反射机制进行。execute 的格式为:,public String execute(),该函数返回一个字符串,表示的是目标页面的虚拟名称,编写并配置 Action,配置文件,/loginSuccess.jsp,/loginFail.jsp,编写并配置 Action,从以上配置可以看出,在标签中可以有多个,名称任意,但不要重名;extends 属性表示继承一个默认的配置文件struts-default,一般都继承于它,可以不用修改。标签中的 name 属性表示 Action 被提交时的路径,class 指定动作类路径,测试,*具体代码测试效果图见课本,其他问题,程序运行流程,login.jsp 中 的 表 单 提 交 到 的 地 址 为 /Prj12/login.action ,被 org.apache.struts2.dispatcher.FilterDispatcher 截获,框架把提交的地址的项目名称和扩展名.action去掉,变为/login,读取配置文件,其他问题,在配置文件中,根据/login,找到配置文件中的 action 对应的类,从而得到要提交到的类 LoginAction;在 LoginAction 中,实例化对象,将 account 和 password 封装进去,其他问题,框架调用 LoginAction 的 execute 方法,处理后返回一个字符串,框架根据字符串内容,在配置文件中找到相应的页面,并跳转,其他问题,Action 生命周期,框架先实例化 LoginAction 对象,然后调用 LoginAction 的 setAccount 函数,封装表单数据,然后调用 execute 函数,进行处理,在第二次提交时,LoginAction 会重新实例化,说明每一个 LoginAction 对象都服务一个请求,这和 Servlet 的原理是不一样的,其他问题,在 Action 中访问 Web 对象,获得 request 对象的方法是:,import org.apache.struts2.ServletActionContext;,public String execute()throws Exception,HttpServletRequest request=ServletActionContext.getRequest();,/使用 request,其他问题,在 Action 中访问 Web 对象,获得,response,对象的方法是:,import org.apache.struts2.ServletActionContext;,public String execute()throws Exception,HttpServletResponse response=ServletActionContext.getResponse();,/使用 response,其他问题,在 Action 中访问 Web 对象,获得,application,对象的方法是:,import org.apache.struts2.ServletActionContext;,public String execute()throws Exception,ServletContext application=ServletActionContext.getServletContext();,/使用 application,其他问题,在 Action 中访问 Web 对象,获得,session,对象的方法是:,import com.opensymphony.xwork2.ActionContext;,public String execute()throws Exception,Map session=ActionContext.getContext().getSession();,/使用 session,其他问题,可以发现这里的 session 是个 Map 对象。在 Struts2 中,底层的 session 被封装成了 Map类型,我们可以直接操作这个 map 进行对 session 的写入和读取操作,而不用去直接操作HttpSession 对象,本章结束,本章总结,Struts2 的基本思想,Struts2 的结构和基本使用,Struts2 下用例的开发方法,上机习题,
展开阅读全文