Struts 框架详解



在Struts2的Model-View-Controller模式实现以下五个核心组件

 

动作-Actions

拦截器-Interceptors

值栈/OGNL

结果/结果类型

视图技术

 

Struts 2和传统的MVC框架有些不同,在该框架中的作用的模式,而不是控制器的作用略有不同,虽然有一些重叠。这是Struts的MVC模式的体系结构概述。

\

 

上图描述了Struts2的高层体系结构模型,视图和控制器。一个Struts2的调度Servlet过滤器和拦截器与控制器实现,该模型实现的动作和视图的组合的结果类型和结果。值栈和OGNL提供了共同点,其他部件之间的连接和集成。

除了从上述组分中,将有一个特定的信息,涉及到配置。为Web应用程序的配置,以及配置的行动,拦截器,结果等。

 

基于上述数据图,可以解释用户的请求的生命周期在Struts 2如下所示:

Hello World,

Hello World From Struts2


   
  1. 用户的请求发送到服务器,用于请求某些资源(即页面)。

    该过滤器调度的要求和确定适当的动作。

    配置拦截器的功能适用于如验证,文件上传等。

    选择的动作执行,执行所请求的操作。

    同样,配置拦截器做任何后期处理,如果需要的话。

    最后的结果是由视图准备,并且将结果返回给用户。

    1. 下载并且解压struts之后可以把lib目录下的一下文件复制到我们的项目WEB-INFlib 目录. 要做到这一点,你可以简单地将下降到WEB-INFlib文件夹中的所有下列文件。(下面是最小依赖集)

       

      commons-fileupload-x.y.z.jar

      commons-io-x.y.z.jar

      commons-lang-x.y.jar

      commons-logging-x.y.z.jar

      commons-logging-api-x.y.jar

      freemarker-x.y.z.jar

      javassist-.xy.z.GA

      ognl-x.y.z.jar

      struts2-core-x.y.z.jar

      xwork-core.x.y.z.jar


       

       

      创建动作类(Action Class):

      • Action类是Struts 2的应用程序的关键,我们实现了大部分的Action类中的业务逻辑。Action类来响应用户的操作,当用户点击一个URL。 Action类中的一个或多个方法被执行,并返回一个字符串结果。基于结果的值,一个特定的JSP页面的呈现方式。

         

         

        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        package com.tutorialspoint.struts2;
         
        public class HelloWorldAction{
            private String name;
         
            public String execute() throws Exception {
               return success;
            }
            
            public String getName() {
               return name;
            }
         
            public void setName(String name) {
               this .name = name;
            }
        }

        Struts2框架的HelloWorldAction类将创建一个对象并调用execute方法来响应用户的操作。执行业务逻辑里面的execute方法,并最终返回字符串常量。简单地说,为每个URL你必须执行一个动作类,或者可以直接使用这个类的名称作为操作名,也可以映射到一些其他的名称使用struts.xml文件,如下图所示。

         

         

        创建视图(View)

         

        我们需要一个JSP提交最后的消息,这个页面会使用在Struts 2框架中预定义的动作时,这将会发生在struts.xml文件中定义的映射。

        ?
        1
        2
        <%@ page contentType=text/html; charset=UTF- 8 %>
        <%@ taglib prefix=s uri=/struts-tags %>

        taglib指令告诉Servlet容器中,这个页面将使用Struts2标签,这些标签之前,将通过s。s:property标签显示动作类‘name’的属性值,是调用HelloWorldAction 类的方法getName()。

        接下来创建一个主页面:

        我们还需要在WebContent文件夹中创建index.jsp页面文件。该文件将作为初始动作URL,用户可以直接点击告诉Struts2框架调用的HelloWorldAction类定义的方法并渲染HelloWorld.jsp视图。

        这里可能会遇到一个问题:

         

        web项目无法部署到eclipse配置的本地tomcat

        一、发现问题

        在eclipse中新建Dynamic Web Project,配置好本地的tomcat并写好代码后选择Run on Server,但运行后发现在tomcat的安装目录下的webapps并没有出现所建立的工程名字。

        二、验证

        很明显项目并没有自动部署到Tomcat的Webapps中而是部署在了别的容器中。在内置浏览器中输入https://localhost:8080/webDemo/login.jsp可正常打开。但在外部浏览器上打开https://localhost:8080时确没有出现所期望的小猫画面。

        三、原因

        eclipse不像MyEclipse默认将项目部署到tomcat安装目录下的webapps中,而默认部署到工作目录下

        的.metadata.pluginsorg.eclipse.wst.server.core mp1wtpwebapps中,tmp1文件夹里面存放着该项目的信息。

        四、修改

        为了使项目默认部署到tomcat安装目录下的webapps中,show view—>servers—>找到需要修改的tomcat—>右击 ①停止eclipse内的Tomcat服务器(stop) ②删除该容器中部署的项目(add and remove) ③清除该容器相关数据(clean) ④打开tomcat的修改界面(open)

        ⑤找到servers location,选择第二个(User tomcat Installation) ⑥修改deploy path为webapps ⑦保存关闭

        需要说明的是①②③必须操作,否则下面的步骤会被置灰无法操作。


         

        还会遇到另一个错误就是在jsp的开始会有JavaWeb:报错信息The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path

         

        原来Javaweb工程类中没有添加Tomcat运行时相关类导致。 下面是具体的解决方法: 1、右击web工程-》属性或Build Path-》Java Build Path->Libraries-> Add Libray...->Server Runtime -》Tomcat Server 2、切换到Java Build Path界面中的Orader and Export,选择Tomcat。

         

        主页面的代码如下(index.jsp):

         

        ?
        1
        2
        3
        4
        <%@ page language=java contentType=text/html; charset=ISO- 8859 - 1
            pageEncoding=ISO- 8859 - 1 %>
        <%@ taglib prefix=s uri=/struts-tags%>
           

        hello动作定义在上面的视图文件将被映射到HelloWorldAction类和它的执行方法使用struts.xml文件。当用户点击“提交”按钮,它会导致Struts2框架运行的执行方法定义在其中,HelloWorldAction类和方法的返回值的基础上,将相应的视图选择和呈现的一个响应。

         

         

        配置文件

         

        我们需要一个映射,以配合URL,HelloWorldAction类(模型),HelloWorld.jsp(视图)。映射告诉Struts 2框架的类将如何响应用户的操作(URL),这一类的方法将被执行,在该方法返回的基础上选择什么视图来显示字符串结果。

         

        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        <!--?xml version= 1.0 encoding=UTF- 8 ?-->
         
        <struts>
        <constant name= "struts.devMode" value= "true" >
            < package extends = "struts-default" name= "helloworld" >
              
               
                     <result name= "success" >/Hello.jsp</result>
               </action>
            </ package >
        </constant></struts>

        在这里,我们设置struts.devMode为true,因为我们正在努力开发环境,我们需要看到一些有用的日志消息。然后,我们定义了一个包叫做 helloworld. 当你想要将动作类放入其中时创建一个包是有用的。在我们的例子中,我们的action命名为“hello”,这是相应的URL是/hello.action和备份为HelloWorldAction.class.HelloWorldAction.class中execute方法是时运行的URL的方法/hello.action被调用. 如果execute方法返回success, 然后我们把用户引到HelloWorld.jsp.

         

        下一步是创建一个web.xml文件这是任何请求发送到Struts2的一个切入点。Struts2的应用程序的入口点,将是一个部署描述符(web.xml)中定义的过滤器。

        在web.xm文件中,我们定义一个过滤器org.apache.struts2.dispatcher.FilterDispatcher. web.xml文件需要创建WEB-INF文件夹下的WebContent。 Eclipse在创建项目时已经创建了一个web.xml文件。所以,让我们只需要修改如下:

        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        <!--?xml version= 1.0 encoding=UTF- 8 ?-->
        <web-app http:= "" id= "WebApp_ID" java.sun.com= "" javaee= "" ns= "" version= "3.0" web-app_3_0.xsd= "" xml= "" xmlns= "https://java.sun.com/xml/ns/javaee" xmlns:web= "https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi= "https://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation= "https://java.sun.com/xml/ns/javaee" >
            
            <display-name>Struts 2 </display-name>
            <welcome-file-list>
               <welcome-file>index.jsp</welcome-file>
            </welcome-file-list>
            <filter>
               <filter-name>struts2</filter-name>
               <filter- class >
                  org.apache.struts2.dispatcher.FilterDispatcher
               </filter- class >
            </filter>
         
            <filter-mapping>
               <filter-name>struts2</filter-name>
               <url-pattern>/*</url-pattern>
            </filter-mapping>
        </web-app>

        我们已经指定index.jsp是我们主页的文件。我们已经配置Struts2的过滤器上运行的所有URL (i.e, any url that match the pattern /*)

         

        启用详细的日志:

         

        您可以启用完整的日志记录功能,通过创建工作和Struts2同时创建logging.properties文件在 WEB-INF/classes 文件,在属性文件中,请注意以下两行:

         

        ?
        1
        2
        3
        org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
        org.apache.catalina.core.ContainerBase.[Catalina].handlers =
                                       java.util.logging.ConsoleHandler

        默认logging.properties指定ConsoleHandler的路由记录到stdout和也的FileHandler。一个处理程序的日志级别阈值可以设置使用SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINEST或ALL。
        就是这样。我们已经准备好来运行我们的Hello World应用程序使用Struts 2框架。

         

        下面还有几个需要注意的信息,最主要的是,出错以后要看出错信息,找到原因。现在遇到的问题归结为两个原因:

        1)配置文件中的书写错误。

        2)导包不全面,按照错误提示的导包就行。

         

在Struts2的Model-View-Controller模式实现以下五个核心组件

 

动作-Actions

拦截器-Interceptors

值栈/OGNL

结果/结果类型

视图技术

 

Struts 2和传统的MVC框架有些不同,在该框架中的作用的模式,而不是控制器的作用略有不同,虽然有一些重叠。这是Struts的MVC模式的体系结构概述。

\

 

上图描述了Struts2的高层体系结构模型,视图和控制器。一个Struts2的调度Servlet过滤器和拦截器与控制器实现,该模型实现的动作和视图的组合的结果类型和结果。值栈和OGNL提供了共同点,其他部件之间的连接和集成。

除了从上述组分中,将有一个特定的信息,涉及到配置。为Web应用程序的配置,以及配置的行动,拦截器,结果等。

 

基于上述数据图,可以解释用户的请求的生命周期在Struts 2如下所示:

Hello World,

Hello World From Struts2


   
  1. 用户的请求发送到服务器,用于请求某些资源(即页面)。

    该过滤器调度的要求和确定适当的动作。

    配置拦截器的功能适用于如验证,文件上传等。

    选择的动作执行,执行所请求的操作。

    同样,配置拦截器做任何后期处理,如果需要的话。

    最后的结果是由视图准备,并且将结果返回给用户。

    1. 下载并且解压struts之后可以把lib目录下的一下文件复制到我们的项目WEB-INFlib 目录. 要做到这一点,你可以简单地将下降到WEB-INFlib文件夹中的所有下列文件。(下面是最小依赖集)

       

      commons-fileupload-x.y.z.jar

      commons-io-x.y.z.jar

      commons-lang-x.y.jar

      commons-logging-x.y.z.jar

      commons-logging-api-x.y.jar

      freemarker-x.y.z.jar

      javassist-.xy.z.GA

      ognl-x.y.z.jar

      struts2-core-x.y.z.jar

      xwork-core.x.y.z.jar


       

       

      创建动作类(Action Class):

      • Action类是Struts 2的应用程序的关键,我们实现了大部分的Action类中的业务逻辑。Action类来响应用户的操作,当用户点击一个URL。 Action类中的一个或多个方法被执行,并返回一个字符串结果。基于结果的值,一个特定的JSP页面的呈现方式。

         

         

        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        package com.tutorialspoint.struts2;
         
        public class HelloWorldAction{
            private String name;
         
            public String execute() throws Exception {
               return success;
            }
            
            public String getName() {
               return name;
            }
         
            public void setName(String name) {
               this .name = name;
            }
        }

        Struts2框架的HelloWorldAction类将创建一个对象并调用execute方法来响应用户的操作。执行业务逻辑里面的execute方法,并最终返回字符串常量。简单地说,为每个URL你必须执行一个动作类,或者可以直接使用这个类的名称作为操作名,也可以映射到一些其他的名称使用struts.xml文件,如下图所示。

         

         

        创建视图(View)

         

        我们需要一个JSP提交最后的消息,这个页面会使用在Struts 2框架中预定义的动作时,这将会发生在struts.xml文件中定义的映射。

        ?
        1
        2
        <%@ page contentType=text/html; charset=UTF- 8 %>
        <%@ taglib prefix=s uri=/struts-tags %>

        taglib指令告诉Servlet容器中,这个页面将使用Struts2标签,这些标签之前,将通过s。s:property标签显示动作类‘name’的属性值,是调用HelloWorldAction 类的方法getName()。

        接下来创建一个主页面:

        我们还需要在WebContent文件夹中创建index.jsp页面文件。该文件将作为初始动作URL,用户可以直接点击告诉Struts2框架调用的HelloWorldAction类定义的方法并渲染HelloWorld.jsp视图。

        这里可能会遇到一个问题:

         

        web项目无法部署到eclipse配置的本地tomcat

        一、发现问题

        在eclipse中新建Dynamic Web Project,配置好本地的tomcat并写好代码后选择Run on Server,但运行后发现在tomcat的安装目录下的webapps并没有出现所建立的工程名字。

        二、验证

        很明显项目并没有自动部署到Tomcat的Webapps中而是部署在了别的容器中。在内置浏览器中输入https://localhost:8080/webDemo/login.jsp可正常打开。但在外部浏览器上打开https://localhost:8080时确没有出现所期望的小猫画面。

        三、原因

        eclipse不像MyEclipse默认将项目部署到tomcat安装目录下的webapps中,而默认部署到工作目录下

        的.metadata.pluginsorg.eclipse.wst.server.core mp1wtpwebapps中,tmp1文件夹里面存放着该项目的信息。

        四、修改

        为了使项目默认部署到tomcat安装目录下的webapps中,show view—>servers—>找到需要修改的tomcat—>右击 ①停止eclipse内的Tomcat服务器(stop) ②删除该容器中部署的项目(add and remove) ③清除该容器相关数据(clean) ④打开tomcat的修改界面(open)

        ⑤找到servers location,选择第二个(User tomcat Installation) ⑥修改deploy path为webapps ⑦保存关闭

        需要说明的是①②③必须操作,否则下面的步骤会被置灰无法操作。


         

        还会遇到另一个错误就是在jsp的开始会有JavaWeb:报错信息The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path

         

        原来Javaweb工程类中没有添加Tomcat运行时相关类导致。 下面是具体的解决方法: 1、右击web工程-》属性或Build Path-》Java Build Path->Libraries-> Add Libray...->Server Runtime -》Tomcat Server 2、切换到Java Build Path界面中的Orader and Export,选择Tomcat。

         

        主页面的代码如下(index.jsp):

         

        ?
        1
        2
        3
        4
        <%@ page language=java contentType=text/html; charset=ISO- 8859 - 1
            pageEncoding=ISO- 8859 - 1 %>
        <%@ taglib prefix=s uri=/struts-tags%>
           

        hello动作定义在上面的视图文件将被映射到HelloWorldAction类和它的执行方法使用struts.xml文件。当用户点击“提交”按钮,它会导致Struts2框架运行的执行方法定义在其中,HelloWorldAction类和方法的返回值的基础上,将相应的视图选择和呈现的一个响应。

         

         

        配置文件

         

        我们需要一个映射,以配合URL,HelloWorldAction类(模型),HelloWorld.jsp(视图)。映射告诉Struts 2框架的类将如何响应用户的操作(URL),这一类的方法将被执行,在该方法返回的基础上选择什么视图来显示字符串结果。

         

        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        <!--?xml version= 1.0 encoding=UTF- 8 ?-->
         
        <struts>
        <constant name= "struts.devMode" value= "true" >
            < package extends = "struts-default" name= "helloworld" >
              
               
                     <result name= "success" >/Hello.jsp</result>
               </action>
            </ package >
        </constant></struts>

        在这里,我们设置struts.devMode为true,因为我们正在努力开发环境,我们需要看到一些有用的日志消息。然后,我们定义了一个包叫做 helloworld. 当你想要将动作类放入其中时创建一个包是有用的。在我们的例子中,我们的action命名为“hello”,这是相应的URL是/hello.action和备份为HelloWorldAction.class.HelloWorldAction.class中execute方法是时运行的URL的方法/hello.action被调用. 如果execute方法返回success, 然后我们把用户引到HelloWorld.jsp.

         

        下一步是创建一个web.xml文件这是任何请求发送到Struts2的一个切入点。Struts2的应用程序的入口点,将是一个部署描述符(web.xml)中定义的过滤器。

        在web.xm文件中,我们定义一个过滤器org.apache.struts2.dispatcher.FilterDispatcher. web.xml文件需要创建WEB-INF文件夹下的WebContent。 Eclipse在创建项目时已经创建了一个web.xml文件。所以,让我们只需要修改如下:

        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        <!--?xml version= 1.0 encoding=UTF- 8 ?-->
        <web-app http:= "" id= "WebApp_ID" java.sun.com= "" javaee= "" ns= "" version= "3.0" web-app_3_0.xsd= "" xml= "" xmlns= "https://java.sun.com/xml/ns/javaee" xmlns:web= "https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi= "https://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation= "https://java.sun.com/xml/ns/javaee" >
            
            <display-name>Struts 2 </display-name>
            <welcome-file-list>
               <welcome-file>index.jsp</welcome-file>
            </welcome-file-list>
            <filter>
               <filter-name>struts2</filter-name>
               <filter- class >
                  org.apache.struts2.dispatcher.FilterDispatcher
               </filter- class >
            </filter>
         
            <filter-mapping>
               <filter-name>struts2</filter-name>
               <url-pattern>/*</url-pattern>
            </filter-mapping>
        </web-app>

        我们已经指定index.jsp是我们主页的文件。我们已经配置Struts2的过滤器上运行的所有URL (i.e, any url that match the pattern /*)

         

        启用详细的日志:

         

        您可以启用完整的日志记录功能,通过创建工作和Struts2同时创建logging.properties文件在 WEB-INF/classes 文件,在属性文件中,请注意以下两行:

         

        ?
        1
        2
        3
        org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
        org.apache.catalina.core.ContainerBase.[Catalina].handlers =
                                       java.util.logging.ConsoleHandler

        默认logging.properties指定ConsoleHandler的路由记录到stdout和也的FileHandler。一个处理程序的日志级别阈值可以设置使用SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINEST或ALL。
        就是这样。我们已经准备好来运行我们的Hello World应用程序使用Struts 2框架。

         

        下面还有几个需要注意的信息,最主要的是,出错以后要看出错信息,找到原因。现在遇到的问题归结为两个原因:

        1)配置文件中的书写错误。

        2)导包不全面,按照错误提示的导包就行。

         

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值