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的方法中

java框架学习系列

bug使用spring+struts2注解开发,提示” There is no Action mapped for namespace [/] and action name [xxxxx.act

Java基础101 Struts2下的 jquery+ajax+struts 技术实现异步刷新功能

Struts2基础使用教程:OGNL