zoukankan      html  css  js  c++  java
  • 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部署为例:可以看到部署路径如下:

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

    被拆分的配置文件需要在struts.xml中引入,例如:  <include file ="struts-user.xml">

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

  • 相关阅读:
    解决electron-vue中无法使用Element的Tooltip组件
    解决Electron安装包下载慢的问题
    虚拟机VirtualBox 共享挂载问题:mount: /mnt/xxx: wrong fs type, bad option, bad superblock on xxx
    git 设置和取消代理
    (转载)数据库连接池到底应该设多大?这篇文章可能会颠覆你的认知
    MySQL主主复制+MMM实现高可用
    Mysql5.6主从热备配置
    java 启动 shell脚本
    redis批量删除key
    spring mvc异常统一处理(ControllerAdvice注解)
  • 原文地址:https://www.cnblogs.com/enjoyjava/p/8993863.html
Copyright © 2011-2022 走看看