Struts2框架的基本使用

Struts2框架的基本使用前面已经介绍过了 MVC 思想 Struts2 是一个优秀的 MVC 框架 大大降低了各个层之间的耦合度 具有很好的扩展性 从本篇开始我们学习 Struts2 的基本用法 本篇主要包括以下内容 Struts2 的下载安装理解整个框架的运行流程自定义实现 Action 自定义配置处理结果一 下载和安装 Struts2 nbsp nbsp nbsp nbsp nbsp 登录 Apache 官网 http struts apache org downlo

     前面已经介绍过了MVC思想,Struts2是一个优秀的MVC框架,大大降低了各个层之间的耦合度,具有很好的扩展性。从本篇开始我们学习Struts2的基本用法,本篇主要包括以下内容:

  • Struts2的下载安装
  • 理解整个框架的运行流程
  • 自定义实现Action
  • 自定义配置处理结果

一、下载和安装Struts2
     登录Apache官网 http://struts.apache.org/download.cgi#struts23163 下载最新版本的Struts,当然建议下载2.3版本的,因为2.5版本刚出来,有些示例应用并不是很全。解压压缩包,得到Struts2的源码及示例代码。
这里写图片描述




apps目录中主要是官方提供的Struts2的实例代码,对于我们的学习是很有用的。docs中主要是有关Struts2的相关文档内容。lib目录中主要存放了有关Struts2的核心类库,以及第三方插件库。src中包含了Struts2的全部源代码。

二、理解Struts2的运行流程
     下面演示一个完整的使用Struts2的实例,目的不是具体的代码,重点在于理解整个框架的运作流程。首先我们需要从apps目录中的struts2-blank示例项目中拷贝出整个lib目录。(这是使用Struts2最基本的jar包,没必要从Struts2的lib中一个一个找,因为你也不知道哪些是必需的),我们将他们导入到我们的项目中。

这里写图片描述

这是整个Struts2的请求和响应流程,下面看具体代码中是如何体现的。

//web.xml,首先在web.xml中添加如下代码,拦截所有请求,即所有请求现在全部归Struts2框架管了 <filter> <filter-name>struts 
   filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 
   filter-class>  
   filter> <filter-mapping> <filter-name>struts 
   filter-name> <url-pattern>/* 
   url-pattern>  
   filter-mapping>
//编写Action充当控制器 public class LoginAction extends ActionSupport { 
    private String username; private String password; public String getUsername(){ return this.username; } public void setUsername(String s){ this.username = s; } public String getPassword(){ return this.password; } public void setPassword(String s){ this.password = s; } public String execute() throws Exception{ if(getUsername().equals("walker")&&getPassword().equals("yam")){ return SUCCESS; } return ERROR; } }
//新建Struts.xml文件用于配置框架  
     <struts> <package name="walker" extends="struts-default"> <action name="login" class="MyPackage.LoginAction"> <result name="error">/error.jsp 
   result> <result name="success">/index.jsp 
   result>  
   action>  
   package>  
   struts>
/*login.jsp*/ <html> <head> <title>login 
   title>  
   head> <body> <form method="post" action="login"> 姓名:<input type="text" name="username" /><br /> 密码:<input type="password" name="password" /><br /> <input type="submit" value="提交"/>  
   form>  
   body>  
   html>

我们访问login.jsp页面,

这里写图片描述

这就是一个简单的Struts2框架的请求和响应过程,可以看到整个框架的核心是主拦截器和各种控制器Action,下面我们具体看看控制器的相关知识。

三、自定义实现Action
     在Action中使用实例变量来封装请求的参数,正如上面的例子所示:我们在login.jsp页面提交的username和password两个参数,对应于LoginAction中的两个参数,在核心拦截器跳转LoginAction时,将两个请求参数自动赋值给LoginAction的两个实例变量。需要注意的是,对于LoginAction中的这两个实例变量,是需要提供setter和geter方法的,我们的核心拦截器在跳转LoginAction的时候也是通过setter方法来对具体的实例参数进行赋值的。
     我们想要自定义xxxAction控制器,需要继承Action接口,并实现其中的方法。




public interface Action { String SUCCESS = "success"; String NONE = "none"; String ERROR = "error"; String INPUT = "input"; String LOGIN = "login"; String execute() throws Exception; }

我们可以看到在Action接口中定义了几个常用的字符串,这些字符串会被用于对应物理视图位置,详细的内容后文介绍。此处有一个execute方法,这个方法就类似于我们JavaSE中的main方法,一旦核心拦截器拦截请求跳转到Action页面,会默认执行execute方法。细心的读者可能发现,上述的例子中并没有继承Action接口,而是继承了ActionSupport类。其实ActionSupport类还是继承了Action接口并实现了execute方法,只是ActionSupport类还为我们默认的实现了一些其他的工具函数,方便我们使用,所以基本上在自定义Action的时候会继承ActionSupport类来减轻编码难度。

     Struts2中的Action没有任何和Servlet API耦合的地方,也就是在Action控制器中没有关于任何可直接操作Servlet API的接口调用。对于各个模块之间的分离,Struts还是做的很优秀的。那我们在Action控制器中没法直接操作Servlet的一些对象,例如:request,response等,但是Struts2框架提供了一个工具类,可以为我们提供这些对象。ActionContext:

static ThreadLocal<ActionContext> actionContext = new ThreadLocal(); //通过静态工厂创建ActionContext实例对象 public static ActionContext getContext() { return (ActionContext)actionContext.get(); } //以map的形式设置application范围内的共享数据 public void setApplication(Map<String, Object> application) //获取application范围内的共享数据 public Map<String, Object> getApplication() //以map的形式设置session范围内的共享数据 public void setSession(Map<String, Object> session) //获取session范围内的共享数据 public Map<String, Object> getSession() //获取request范围内的指定的参数值 public Object get(String key) //向request范围内添加一个key-value的参数 public void put(String key, Object value) //获取request的所有请求参数 public Map<String, Object> getParameters() //向request范围内添加一批请求参数 public void setParameters(Map<String, Object> parameters)

我们往往通过ActionContext的静态方法,通过本地线程ThreadLocal获取ActionContext实例,此ActionContext封装了有关Servlet操作的各种API调用方法。我们看一个简单的使用:

public class LoginAction extends ActionSupport { 
    private String username; private String password; public String getUsername(){ return this.username; } public void setUsername(String s){ this.username = s; } public String getPassword(){ return this.password; } public void setPassword(String s){ this.password = s; } public String execute() throws Exception{ if(getUsername().equals("walker")&&getPassword().equals("yam")){ ActionContext ac = ActionContext.getContext(); ac.put("login","登录成功"); return SUCCESS; } return ERROR; } }
<html> <head> <title> 
   title>  
   head> <body> <p><%=request.getAttribute("login")%> 
   p> <h1>this is the index page 
   h1>  
   body>  
   html>

结果如下:

这里写图片描述

以上我们演示了如何通过ActionContext 这个工具类来完成对Servlet API的调用。其实还可以使用ServletActionContext这个工具类来直接获取到原Servlet的pageContext,request,response等对象。具体的大家可以自行研究。

四、Action的配置
     以上我们完成了对xxxAction控制器的编写,但是如果想要我们的核心拦截器能够在用户请求URL时,找到对应的Action控制器,我们需要学会在Struts.xml中配置。之前我们介绍过,web.xml是用来配置整个web应用的,那么我们的struts.xml就是用来配置整个框架的。struts.xml应该被创建并放置在类的加载文件夹中,使用IDE的话,就创建在src文件夹下,在编译的时候会被拷贝到WEB-INF/classes中。

这里写图片描述

对于上述的示例,该struts.xml中的内容如下:

 
     <struts> <package name="walker" extends="struts-default"> <action name="login" class="MyPackage.LoginAction"> <result name="error">/error.jsp 
   result> <result name="success">/index.jsp 
   result>  
   action>  
   package>  
   struts>
  • name:该属性指定了该包的唯一标识,是必须属性
  • extends:该属性指定了该包可以继承别的包,当然别的包中的所有Action这里都是可用的了,非必须属性
  • namespace:该属性指定了该包下的所有Action的命名空间,主要用于区分同名的Action,非必须属性
  • abstract:指定了该包是一个抽象的包,抽象的包中是不能定义Action的,但是可以有大量的类型定义、拦截器定义等

从上面给出的Struts.xml中,我们可以看出来,该包继承了struts-default包,这是struts2-core-2.3.32.3.jar 中的文件,部分内容如下:

这里写图片描述

 
  
    name= 
   "walker" extends= 
   "struts-default" namespace= 
   "a"> 
   
     name= 
    "login" 
    class= 
    "MyPackage.LoginAction"> < 
    result 
    name= 
    "error">/ 
    error.jsp 
    result> < 
    result 
    name= 
    "success">/index.jsp 
    result> 
    
  
 
  
    name= 
   "yam" extends= 
   "struts-default" namespace= 
   "b"> 
   
     name= 
    "login" 
    class= 
    "MyPackage.LoginAction"> < 
    result 
    name= 
    "error">/ 
    error.jsp 
    result> < 
    result 
    name= 
    "success">/index.jsp 
    result> 
    
  

我们看这两个包,他们下面配置了相同的Action,但是当时他们具有不同的命名空间,所以不会产生冲突。例如:我们请求walker包下的login action的URL为:

/a/login

而yam包下的login action的请求URL为:

/b/login

以上我们演示package包下的一些属性的作用,需要注意一点的是:如果没有指定namespace的值,则该包下的所有Action都处于默认的命名空间下,此处默认的命名空间和 namespace=”/” 是有区别的,后者表示该包处于根命名空间下,而前者中则包含了所有没有指定namespace值的包。如果框架在根命名空间或者别的命名空间下找不到指定的Action,则会前往默认命名空间下查找指定了Action。

限于篇幅,未完待续。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209304.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午9:33
下一篇 2026年3月19日 上午9:34


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号