Strut2中,Action可以不继承任何特殊的类或不实现任何特殊的接口,可以只编写一个普通的Java类作为Action类,只要该类含有一个返回字符串的无参的public方法即可!实际开发中,通常继承ActionSupport类(该类继承了Action接口)来编写Action请求处理类。以下就以普通Java类作为Actoin类进行示例:

项目结构

1。web.xml配置

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <filter>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<url-pattern>/*</url-pattern> //对所有请求进行拦截

<!--<url-pattern>*.action</url-pattern>--> //对以.action结尾的请求进行拦截

     </filter-mapping>

 </web-app>

2. Action类

 package cn.test.action;

 public class UserAction {

     public String login(){
return "success";
} public String register(){
return "success";
} }

3.struts.xml配置Action类

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="user" namespace="/user" extends="struts-default">
<action name="login" class="cn.test.action.UserAction" method="login">
<result>/login.jsp</result><!-- result不写name属性,默认就是success -->
</action>
<action name="register" class="cn.test.action.UserAction" method="register">
<result>/register.jsp</result>
</action>
</package> </struts>

4. jsp页面,没有实质性代码,仅仅作为展示Struts2请求处理展示

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</title>
</head> <body>
This is my login JSP page. <br>
</body>
</html>
 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'register' starting page</title>
</head> <body>
This is my register JSP page. <br>
</body>
</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

 <!-- 默认命名空间 -->
<package name="" namespace="/" extends="struts-default">
<action name="login" class="cn.test.action.UserAction" method="login">
<result>/index.jsp</result>
</action>
</package>

添加index.jsp页面

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'register' starting page</title>
</head> <body>
This is my index JSP page. <br>
</body>
</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控制器的更多相关文章

  1. Struts2基础-3 -继承ActionSupport接口创建Action控制器+javaBean接收请求参数+ 默认Action配置处理请求错误 + 使用ActionContext访问ServletAPI

    1.目录结构及导入的jar包 2.web.xml 配置 <?xml version="1.0" encoding="UTF-8"?> <web ...

  2. Java基础_0305:简单Java类

    简单Java类 简单Java类是一种在实际开发之中使用最多的类的定义形式,在简单Java类中包含有类.对象.构造方法.private封装等核心概念的使用,而对于简单Java类首先给出如下的基本开发要求 ...

  3. JAVA基础学习之路(四)定义简单java类

    简单java类开发一般原则: 类名称必须有意义,再怎么说,要让人家看的明白吧 类之中所有属性必须使用private封装,并提供setter,getter方法 类之中可以有多个构造方法,但是必须保留有一 ...

  4. java--分析简单java类与反射的联系

    分析简单java类与反射的联系 web对反射的操作支持 在JSP之中有一种技术--javaBean.而且在jsp里面也配套有相应的操作方式,javaBean的核心在于简单java类,于是下面演示此操作 ...

  5. 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现

    /*  现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息    对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...

  6. 进阶Java编程(10)反射与简单Java类

    1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...

  7. java反射(四)--反射与简单java类

    一.传统简单java类 简单的java类主要是由属性所组成,并且提供有相应的setter以及getter的处理方法,同时简单java类最大的特征就是通过对象保存相应的类的属性内容,但是如果使用传统的简 ...

  8. 类的编写模板之简单Java类

    简单Java类是初学java时的一个重要的类模型,一般由属性和getter.setter方法组成,该类不涉及复杂的逻辑运算,仅仅是作为数据的储存,同时该类一般都有明确的实物类型.如:定义一个雇员的类, ...

  9. 《Java基础知识》Java类的基本运行顺序

    我们以下面的类来说明一个基本的 Java 类的运行顺序: public class Demo { private String name; private int age; public Demo() ...

随机推荐

  1. day16—正是Github,让社会化编程成为现实。

    转行学开发,代码100天——2018-04-01 今天简单了解了一下GitHub的使用. 对于GitHub,在很多年前开始写程序的时候就频繁听到,也早早地注册之后看了真容.但是由于自己一直未产出较大型 ...

  2. Python算法每日一题--002--求众数

    给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3]输出: 3示 ...

  3. PA动画使用教程

    1.动画复制与动画粘贴.动画删除 PA的动画复制.动画粘贴不会覆盖原有动画: PPT自带的动画刷会覆盖原有动画: 注意: 超级属性的动画复制.粘贴有bug,应使用自带的动画刷: PA动画的复制.粘贴只 ...

  4. Filter 和Listener

    Filter 和Listener Filter : 过滤器 1.概念 浏览器发出请求访问服务器的资源,过滤器将请求拦截,完成一些特殊的功能. 作用:一般用于完成通过的操作.如:登陆验证.统一编码处理. ...

  5. 问题处理——"无法导航到插入符号下的符号"

    最近编码时经常发现"转到定义"功能没法用了,代码一片灰.刚开始时重新编译一下项目或重启一下VS就恢复了,但到后面这两种方法都不管用了. 偶然下发现解决方案中很多项目的引用都出现了黄 ...

  6. 并行开发 2.plink

    原文:8天玩转并行开发——第二天 Task的使用 在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击, ...

  7. Electron 无边框窗口最大化最小化关闭功能

    Electron 无边框窗口最大化最小化关闭功能 目的 实现无边框窗口,并添加最大化最小化和关闭功能 前提 了解Electron 主进程和渲染进程的通讯 了解 BrowserWindow相关功能 操作 ...

  8. elasticsearch 深入 —— Scroll滚动查询

    Scroll search 请求返回一个单一的结果"页",而 scroll API 可以被用来检索大量的结果(甚至所有的结果),就像在传统数据库中使用的游标 cursor. 滚动并 ...

  9. tensorflow的阶、形状、数据类型

    张量的阶.形状.数据类型 TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通. 阶 ...

  10. C语言实现读取文件所有内容到字符串

    #include "stdio.h" #include "string" #include "stdlib.h" using namespa ...