Struts2基础-1- 简单java类实现Action控制器
Posted 清风拂来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2基础-1- 简单java类实现Action控制器相关的知识,希望对你有一定的参考价值。
Strut2中,Action可以不继承任何特殊的类或不实现任何特殊的接口,可以只编写一个普通的Java类作为Action类,只要该类含有一个返回字符串的无参的public方法即可!实际开发中,通常继承ActionSupport类(该类继承了Action接口)来编写Action请求处理类。以下就以普通Java类作为Actoin类进行示例:
项目结构
1。web.xml配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 5 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 6 <welcome-file-list> 7 <welcome-file>index.jsp</welcome-file> 8 </welcome-file-list> 9 10 <filter> 11 <filter-name>StrutsPrepareAndExecuteFilter</filter-name> 12 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 13 </filter> 14 15 <filter-mapping> 16 <filter-name>StrutsPrepareAndExecuteFilter</filter-name> 17 <url-pattern>/*</url-pattern> //对所有请求进行拦截
<!--<url-pattern>*.action</url-pattern>--> //对以.action结尾的请求进行拦截
18 </filter-mapping> 19 20 </web-app>
2. Action类
1 package cn.test.action; 2 3 public class UserAction { 4 5 public String login(){ 6 return "success"; 7 } 8 9 public String register(){ 10 return "success"; 11 } 12 13 }
3.struts.xml配置Action类
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <package name="user" namespace="/user" extends="struts-default"> 7 <action name="login" class="cn.test.action.UserAction" method="login"> 8 <result>/login.jsp</result><!-- result不写name属性,默认就是success --> 9 </action> 10 <action name="register" class="cn.test.action.UserAction" method="register"> 11 <result>/register.jsp</result> 12 </action> 13 </package> 14 15 </struts>
4. jsp页面,没有实质性代码,仅仅作为展示Struts2请求处理展示
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 <title>My JSP \'login.jsp\' starting page</title> 12 </head> 13 14 <body> 15 This is my login JSP page. <br> 16 </body> 17 </html>
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 <title>My JSP \'register\' starting page</title> 12 </head> 13 14 <body> 15 This is my register JSP page. <br> 16 </body> 17 </html>
5.部署并访问:
http://localhost:8080/strutsstu0/user/login 结果如下:
访问http://localhost:8080/strutsstu0/user/register 结果如下
如果web.xml中 url-pattern 配置成 <url-pattern>*.action</url-pattern> ,那么访问时就要 在后面加上.action了 :http://localhost:8080/strutsstu0/user/login.action,结果如下:
6. Struts2执行过程分析:
(1)web.xml
Struts2框架基于MVC模式,基于MVC模式框架的核心就是控制器对所有请求进行统一处理。Struts2的控制器 StrutsPrepareAndExecuteFilter 由Servlet API中的Filter充当,
当Web容器接收到请求后,将请求交给Web.xml中配置的过滤器StrutsPrepareAndExecuteFilter ,这个过滤器对框架进行初始化,以及处理所有的请求。(任何一个web应用程序都是基于请求/响应模式进行构建的,无论采用哪种MVC框架,都离不开Web.xml文件的配置。只有在web应用中配置了web.xml文件,MVC框架才能真正地与web应用融合起来。)
StrutsPrepareAndExecuteFilter 可以包含一些初始化参数,如果没有配置初始化参数,Struts2框架默认加载Struts-default.xml、struts-plugin.xml 和 struts.xml
(2) Action
Struts2框架中国年,控制器由两个部分组成:核心控制器Filter 用于拦截用户请求,对请求进行处理;业务控制器,调用相应的Model类实现业务处理,返回结果
struts.xml配置文件中,将一个请求的URI对应到一个Action类,当一个请求匹配某个Action的名称时,框架就会使用这个Action类处理请求。
<package name="user" namespace="/user" extends="struts-default"> 7 <action name="login" class="cn.test.action.UserAction" method="login"> 8 <result>/login.jsp</result><!-- result不写name属性,默认就是success --> 9 </action> 10 <action name="register" class="cn.test.action.UserAction" method="register"> 11 <result>/register.jsp</result> 12 </action> 13 </package>
配置讲解:
Struts2框架会把action result等组织在一个名为package 的逻辑单元中,从而简化维护工作,提高重用性,每一个包都包含了将要用到的action result等的定义。Struts2中的包可以“继承”
已经定义好的包,从而继承原有包的所有定义(包括action result 等的配置)并且可以添加自己包的位置。
struts.xml中使用 package元素定义包,其中:
name属性为必须,并且唯一的,用来指定包的名称(被其他包引用)
extends属性指定要扩展的包,一般默认继承 Struts-default 包(这个包由struts2框架爱定义,其中配置了大量常用的Struts2的特性。如果没有这些特性,则简单的在action中获取请求数据都无法完成。)
namespace属性可选,该属性定义该包中action的命名空间,如果没有设置该属性,action被放入默认命名空间中,Struts2框架使用action的名称和它所在的包的命名空间来标识一个action,默认的命名空间用" "来表示,也可以使用“ / ”来定义一个根命名空间,两者有区别。当Struts2接收到一个请求时,框架会讲URL分为namespace 和action 名称两部分,框架首先在namespace 命名空间中查找这个action,若没有找到,则再在默认命名空间中查找。
例如,请求URL为/mysapce/somespace/some.action ,框架首先会在/mysapce/somespace命名空间下查找some.action ,如果没有找到,框架会到默认的命名空间中去查找
示例:在上述项目的 struts.xml配置文件中增加 默认命名空间,action元素的name属性仍然叫login,修改跳转页面为index.jsp
1 <!-- 默认命名空间 --> 2 <package name="" namespace="/" extends="struts-default"> 3 <action name="login" class="cn.test.action.UserAction" method="login"> 4 <result>/index.jsp</result> 5 </action> 6 </package>
添加index.jsp页面
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 <title>My JSP \'register\' starting page</title> 12 </head> 13 14 <body> 15 This is my index JSP page. <br> 16 </body> 17 </html>
然后重新部署并访问http://localhost:8080/strutsstu0/login ,结果如下,也就是说,此时处理请求的是默认的根命名空间下的action,页面跳转到了index.jsp
(3)Result
Action类在处理完用户请求后,会返回一个处理结果,这个结果是一个简单字符串,框架根据这个字符串选择对应的result,因此又将这个字符串成为逻辑视图名称,这个逻辑视图名称由result元素的name属性来表示,result元素的值(<result> </result> 中的内容)用来指定这个逻辑视图对应的物理视图资源的位置,需要注意的是,逻辑视图名称只有与物理视图资源联系在以一起才能发挥作用,所以必须配置二者之间的对应关系。
result元素的配置由两部分组成,一部分是Result所代表的实际资源的位置以及result名称,另一部分是result的类型,由result元素的type属性设定
result元素的name属性不写,则默认是“success”, type属性不写,则默认是"dispatcher",<result >/index.jsp</result> 等价于
<result name="success" type="dispatcher">/index.jsp</result>
总结:struts2应用的这个过程都是按照请求/响应的过程执行的,如下图所示:
整体就三个步骤:
(1)当web容器接收到请求之后,将请求交给web.xml中配置的struts2框架的核心控制器StrutsPrepareAndExecuteFilter
(2)由StrutsPrepareAndExecuteFilter 确定请求对应的Action(业务控制器)
(3)框架根据Action返回的结果字符串,由核心控制器StrutsPrepareAndExecuteFilter 选择对应的result ,将结果呈现给用户
注意:
(a)Action作为业务控制器,只负责返回结果,而不与视图相关联,这样做的优势在于,当视图发生变化时,无需修改Action类的代码,仅需修改配置文件即可
(b)当 StrutsPrepareAndExecuteFilter 调用相应的视图时,默认采用转发的形式(forword)跳转到指定的JSP页面
<result name="success" type="dispatcher">/index.jsp</result>
type值可以是:
(1)dispatcher:
默认的结果类型,Struts2内部使用功能Servlet API的RequestDispathcer来转发请求到指定的视图资源,请求中国年包含的请求数据仍然存在
(2)redirect:
请求重定向,就是服务器告诉请求说,你自己去重新请求指定的视图资源吧。redirect结果类型在内部使用的HttpServletResponse对象的sengRedirect()方法将请求重定向到指定的URL,这意味着请求中包含的参数,属性,action实例以及action封装的属性都将全部丢失
(3)redirectAction:
将重定向到另外一个Action。是使用HttpServletResponse对象的sengRedirect()方法将请求重定向到另外一个action.也就是说,当请求处理完成后,需要在另一个Action中继续处理请求时,可以使用redirectAction重定向到指定Action(由于是重定向,请求参数也会丢失)
7.struts配置文件加载路径
以本机tomcat部署为例:可以看到部署路径如下:
进入strutsstu0\\WEB-INF\\classes目录下,可以看到struts.xml配置文件,Struts2允许将一个配置文件拆分成多个配置文件,但默认只加载 WEB-INF\\classes目录下的struts.xml文件
被拆分的配置文件需要在struts.xml中引入,例如: <include file ="struts-user.xml">
代码github下载地址 : https://github.com/liuch0228/Struts2SSH.git
以上是关于Struts2基础-1- 简单java类实现Action控制器的主要内容,如果未能解决你的问题,请参考以下文章
readbook:自己设计mvc框架,java类似struts2的实现
Struts2中如何从action的一个方法中跳转到另一个action的方法中
bug使用spring+struts2注解开发,提示” There is no Action mapped for namespace [/] and action name [xxxxx.act