Struts2基础-1- 简单java类实现Action控制器
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控制器的更多相关文章
- Struts2基础-3 -继承ActionSupport接口创建Action控制器+javaBean接收请求参数+ 默认Action配置处理请求错误 + 使用ActionContext访问ServletAPI
1.目录结构及导入的jar包 2.web.xml 配置 <?xml version="1.0" encoding="UTF-8"?> <web ...
- Java基础_0305:简单Java类
简单Java类 简单Java类是一种在实际开发之中使用最多的类的定义形式,在简单Java类中包含有类.对象.构造方法.private封装等核心概念的使用,而对于简单Java类首先给出如下的基本开发要求 ...
- JAVA基础学习之路(四)定义简单java类
简单java类开发一般原则: 类名称必须有意义,再怎么说,要让人家看的明白吧 类之中所有属性必须使用private封装,并提供setter,getter方法 类之中可以有多个构造方法,但是必须保留有一 ...
- java--分析简单java类与反射的联系
分析简单java类与反射的联系 web对反射的操作支持 在JSP之中有一种技术--javaBean.而且在jsp里面也配套有相应的操作方式,javaBean的核心在于简单java类,于是下面演示此操作 ...
- 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现
/* 现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息 对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...
- 进阶Java编程(10)反射与简单Java类
1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...
- java反射(四)--反射与简单java类
一.传统简单java类 简单的java类主要是由属性所组成,并且提供有相应的setter以及getter的处理方法,同时简单java类最大的特征就是通过对象保存相应的类的属性内容,但是如果使用传统的简 ...
- 类的编写模板之简单Java类
简单Java类是初学java时的一个重要的类模型,一般由属性和getter.setter方法组成,该类不涉及复杂的逻辑运算,仅仅是作为数据的储存,同时该类一般都有明确的实物类型.如:定义一个雇员的类, ...
- 《Java基础知识》Java类的基本运行顺序
我们以下面的类来说明一个基本的 Java 类的运行顺序: public class Demo { private String name; private int age; public Demo() ...
随机推荐
- EZOJ #373排序
分析 它居然真的是个nlog^3暴力?! 两个数在加小于min(lowbit(x),lowbit(y))的数时对他们的奇偶性不影响 因此每次加上min(lowbit(x),lowbit(y))判断此时 ...
- install mysql firewall
- anki2.1中使用latex,使用 MathJax 渲染latex格式的数学公式,化学公式
说说mathJax的优点: 不在anki媒体库生成图片,有利于节约手机空间. 再说说它的缺点:需要学习latex,需要一些时间去掌握latex语法. 1.去MathJax的github下载源码包 2. ...
- Chrome开发小技巧--浏览器控制台现写并运行js代码--snippets
想简单等运行一段js代码,以前可能会新建一个html 里面包含script标签,或者引入一个js,然后chrome浏览器打开.这样很麻烦. 想再console控制台写,也不方便,换行处理麻烦. 基于在 ...
- 深入RESTful无状态原则
目录 目录 前言 无状态原则 Web服务的状态 基于状态的Web服务 基于无状态的Web服务 总结两者的区别 前言 在上篇RESTful基础知识中整体的介绍了RESTful架构设计思想的框架,在往后的 ...
- 将多个jpg文件以追加形式合并成一个文件_delphi教程 bmp 合并 http://www.west.cn/www/info/58058-1.htm
将多个jpg文件以追加形式合并成一个文件_delphi教程 作者:网友供稿 点击:0 西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!云服务器 ...
- mysql - 标识列
#标识列 /* 又称为自增长列 含义:可以不用手动插入值,系统提供默认的序列值 特点: 1.表示列必须和主键搭配吗?不一定,但是要求是一个key 2.一个表中只能有一个标识列! 3.标识列的类型有限制 ...
- 《JAVA设计模式》之抽象工厂模式(Abstract Factory)
场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...
- CentOS7没有ifconfig/route/arp/netstat等命令的解决方案
查看提供 ifconfig 命令的包 [root@bogon ~]# yum search ifconfig 这里选择安装net-tools包即可 [root@bogon ~]# yum instal ...
- 常见样式问题七、word-break、word-wrap、white-space区别
常见样式问题七.word-break.word-wrap.white-space区别:https://blog.csdn.net/c11073138/article/details/79534394 ...