java struts action_Struts2基础-1- 简单java类实现Action控制器

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

项目结构

f16b0bf9c470b2c118d61f71dfc39bf4.png

1。web.xml配置

1 <?xml version="1.0" encoding="UTF-8"?>

2

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

7 index.jsp

8

9

10

11 StrutsPrepareAndExecuteFilter

12 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

13

14

15

16 StrutsPrepareAndExecuteFilter

17 /* //对所有请求进行拦截

//对以.action结尾的请求进行拦截

18 19

20

2. Action类

1 packagecn.test.action;2

3 public classUserAction {4

5 publicString login(){6 return "success";7 }8

9 publicString register(){10 return "success";11 }12

13 }

3.struts.xml配置Action类

1 <?xml version="1.0" encoding="UTF-8"?>

2 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

4 "http://struts.apache.org/dtds/struts-2.3.dtd">

5

6

7

8 /login.jsp

9

10

11 /register.jsp

12

13

14

15

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

1

2

3 String path =request.getContextPath();4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";5 %>

6

7

8

9

10

11

My JSP 'login.jsp' starting page

12

13

14

15 This is my login JSP page.

16

17

1

2

3 String path =request.getContextPath();4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";5 %>

6

7

8

9

10

11

My JSP 'register' starting page

12

13

14

15 This is my register JSP page.

16

17

5.部署并访问:

eb462b1e5e31599505d2c4870c0aba35.png

http://localhost:8080/strutsstu0/user/login  结果如下:

12261970b8b24d0eccf0df24547237bb.png

访问http://localhost:8080/strutsstu0/user/register 结果如下

5891fc01e921da2661c5a35d0c12312d.png

如果web.xml中 url-pattern 配置成 *.action,那么访问时就要 在后面加上.action了   :http://localhost:8080/strutsstu0/user/login.action,结果如下:

380f00bac6bef2fe6cba32803d254c26.png

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类处理请求。

7

8 /login.jsp

9

10

11 /register.jsp

12

13

配置讲解:

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

3

4 /index.jsp

5

6

添加index.jsp页面

1

2

3 String path =request.getContextPath();4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";5 %>

6

7

8

9

10

11

My JSP 'register' starting page

12

13

14

15 This is myindex JSP page.

16

17

然后重新部署并访问http://localhost:8080/strutsstu0/login ,结果如下,也就是说,此时处理请求的是默认的根命名空间下的action,页面跳转到了index.jsp

0a828c7cde9169c8b873506645eb42be.png

(3)Result

Action类在处理完用户请求后,会返回一个处理结果,这个结果是一个简单字符串,框架根据这个字符串选择对应的result,因此又将这个字符串成为逻辑视图名称,这个逻辑视图名称由result元素的name属性来表示,result元素的值( 中的内容)用来指定这个逻辑视图对应的物理视图资源的位置,需要注意的是,逻辑视图名称只有与物理视图资源联系在以一起才能发挥作用,所以必须配置二者之间的对应关系。

result元素的配置由两部分组成,一部分是Result所代表的实际资源的位置以及result名称,另一部分是result的类型,由result元素的type属性设定

result元素的name属性不写,则默认是“success”,type属性不写,则默认是"dispatcher",/index.jsp 等价于

/index.jsp

总结:struts2应用的这个过程都是按照请求/响应的过程执行的,如下图所示:

d5943d8a8dab977ee234d71586e74381.png

整体就三个步骤:

(1)当web容器接收到请求之后,将请求交给web.xml中配置的struts2框架的核心控制器StrutsPrepareAndExecuteFilter

(2)由StrutsPrepareAndExecuteFilter 确定请求对应的Action(业务控制器)

(3)框架根据Action返回的结果字符串,由核心控制器StrutsPrepareAndExecuteFilter 选择对应的result ,将结果呈现给用户

注意:

(a)Action作为业务控制器,只负责返回结果,而不与视图相关联,这样做的优势在于,当视图发生变化时,无需修改Action类的代码,仅需修改配置文件即可

(b)当 StrutsPrepareAndExecuteFilter 调用相应的视图时,默认采用转发的形式(forword)跳转到指定的JSP页面

/index.jsp

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部署为例:可以看到部署路径如下:

8bfb93def5ab918a97b37c5ad81f21ec.png

进入strutsstu0\WEB-INF\classes目录下,可以看到struts.xml配置文件,Struts2允许将一个配置文件拆分成多个配置文件,但默认只加载 WEB-INF\classes目录下的struts.xml文件

被拆分的配置文件需要在struts.xml中引入,例如: 

cee20a1bddc5a4a307c2ecb4a1380b7e.png

代码github下载地址 :    https://github.com/liuch0228/Struts2SSH.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值