• Struts2 Day01


    本节内容:

    1JavaEE概述

    2.Struts2的引入

    3.Struts2的入门案例

    4.Struts2的底层执行过程

    5.Struts2的相关配置

    6.Struts2的Action的创建

    7Strust2的action方法的访问

     

    一、JavaEE概述:

      我们学习了Javaweb我们知道我们的Javaweb程序的组成:jsp、servlet、JavaBean,那么我们在学习Javaweb的时候我们程序我们使用了mvc开发模式:

    我们来看一张图来说明一下:

    我们常说的3层结构是什么:3层结构是:web层、service层、dao层3层,把我们的MVC中的view层以及Controller层归为了web层,将我们的model层拆分为了,service业务层、以及dao数据库持久层。

    我们所说的框架是什么呢?,其实我们所说的框架就是针对我们的3层结构不同层的一个替代,我们的框架就是帮我们实现一部分代码,我们只需要很少的代码就可以完成这个功能。

    那么我们所要学习的框架有:

    web层框架: struts2、以及spring框架中springmvc模块

    service层框架:spring框架

    dao层框架:hibernate框架、MyBatis框架 

    我们现在就开始来学习我们的Struts2框架。

    二、struts2的引入

         Struts2简介:

    StrutsApache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。

    2006年,WebWork与Struts的Java EEWeb框架的团体,决定合作共同开发一个新的,整合了WebWork与Struts优点,并且更加优雅、扩展性更强的框架,命名为“Struts 2”,原Struts的1.x版本产品称为“Struts 1”。Struts项目并行提供与维护两个主要版本的框架产品——Struts 1与Struts 2

    在2008年12月,Struts1发布了最后一个正式版(1.3.10),而2013年4月5日,Struts开发组宣布终止了Struts 1的软件开发周期。

    所以我们现在说的Struts都是Struts2.

    Struts就是封装了Servlet中的各种对象以及请求/响应操作,减少了对web容器的依赖,通俗说struts就是一个庞大的servlet。Struts2对struts1做出了很多的改进,struts2对ServletApi不再依赖。

    Struts1的Action是单实例的,一个Action的实例处理所有的请求。Struts 2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题

    Struts1要求必须统一扩展自Action类,而Struts2中可以是一个POJO

    Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。

    Struts2中使用了拦截器。

    总结:

    Struts2使用拦截器概念,结合各种过滤器来获取url,与struts1的最大区别是Struts1(所有请求共享一个实例)单实例,Struts2使用的是多实例(一个请求一个实例)Struts2有一个值栈的概念。Struts2与ServletAPi完全解耦。Struts2可以使用一个POJO类来封装请求。

    三、Struts2的入门案例:

             需求:我们访问一个url后跳转到一个指定的页面。

          Struts2开发准备工作:

          struts2开发环境的搭建:   jdk、idea、tomcat

         1. 我们还需要准备struts2的jar包:

           打开:http://struts.apache.org/download.cgi

         下载struts2的jar包。  进行解压。

    lib下就是struts2的jar包。

    2.创建一个web项目

    再项目中添加struts2的jar包

    3.创建Action:

      在struts2中我们可以创建一个普通的POJO来做我们的action。

       

    package com.struts.action;
    
    /**
     * Action类
     */
    public class HelloWordAction {
        /**
         * action的默认执行方法:action会返回一个字符串
         * @return
         * @throws Exception
         */
        public String execute() throws Exception{
    
    
            return "success";
        }
    
    
    
    
    
    }
    View Code

    4.创建视图:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>欢迎页</title>
      </head>
      <body>
         Hello,World!Struts2!!!!!
      </body>
    </html>
    View Code

    5.需要在web.xml中配置一个过滤器:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        <!--配置struts2的过滤器-->
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>
    View Code

    6.需要在struts.xml中配置action

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
            "http://struts.apache.org/dtds/struts-2.5.dtd">
    
    <struts>
        <!--配置action-->
          <!--package:作用就是分包管理,易于管理我们的action,便于模块开发
             name:包的名称。必须写。且必须唯一
             namespace:名称空间
             extends:一般情况下需要继承struts-default包,但不是必须的。不过如果不继承的话,将无法使用struts2提供的核心功能。
            struts-default.xml中定义着struts-default这个包。而struts-default.xml是在我们的struts.xml加载之前加载。
          -->
        <package name="hello" namespace="/" extends="struts-default">
            <!--配置动作:配置我们的action
              name:动作名称
              class:动作全类名
              method:动作类中的方法名称。默认是public String execute(){}
              要求:
                 1.public的
                 2.返回值必须是String
                 3.没有参数
              -->
            <action name="helloworld" class="com.struts.action.HelloWordAction">
                 <!--最后的输出:响应
                   name:逻辑名
                 -->
                <result name="success">/index.jsp</result>
    
    
            </action>
    
        </package>
    
    
    </struts>
    View Code

    最后运行测试:访问action

    这就是一个基本的struts2的入门程序。

    四、struts2的底层执行过程 

     

    这是一张Struts2的体系架构图:

    Struts2框架的处理步骤:

    1.用户发送请求:

    2.这个请求经过一系列的过滤器(Filter)

    3.调用过滤器:FilterDispatcher,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action 

    4. ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。

    5.ActionProxy通过Configuration Manager询问框架的配置文件struts.xml,找到需要调用的Action类 。(在服务器启动的时候,ConfigurationManager就会把struts.xml中的所有信息读到内存里,并缓存,当ActionProxy带着URL向他询问要运行哪个Action的时候,就可以直接匹配、查找并回答了)

    6.ActionProxy创建一个ActionInvocation的实例。 

    7.ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到一系列相关拦截器(Intercepter)的调用。

    8. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。

    9.最后,ActionInvocation对象倒序执行拦截器。

    10..ActionInvocation对象执行完毕后,响应用户。

    注意:2.1.3之后的核心过滤器由FilterDispatcher换成StrutsPrepareAndExecuteFilter。

    五、Struts2的相关配置

    struts2有6大配置文件:

    1. struts-default.xml    在struts2-core-2.5.17.jar中

    2. default.properties  默认常量配置 org.apache.struts2包下

    3.web.xml    项目的配置文件

    4.struts.xml    核心配置文件

    5.struts.properties  自定义常量配置文件

    6. struts-plugin.xml  插件配置文件

    优先级:web.xml>struts.properties>struts.xml>default.properties

    加载顺序:

    1.default.properties
    2.struts-defualt.xml
    3.struts-plugin.xml
    4.struts.xml //配置Action以及常量
    5.struts.properties //配置常量
    6.web.xml //配置核心过滤器以及常量

    这个在启动服务时查看日志信息就可以看到这个顺序

    struts2的核心配置文件struts.xml的详解

    1.首先我们需要在src目录下创建一个struts.xml文件,并且引入约束:

    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">

    2.struts.xml中有一个根标签<struts></struts>

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
            "http://struts.apache.org/dtds/struts-2.5.dtd">
    
    <struts>
    
            <!--配置常量-->
          <constant name="struts.custom.i18n.resources" value="UTF-8"></constant>
        <!--配置action-->
          <!--package:作用就是分包管理,易于管理我们的action,便于模块开发
             name:包的名称。必须写。且必须唯一
             namespace:名称空间
             extends:一般情况下需要继承struts-default包,但不是必须的。不过如果不继承的话,将无法使用struts2提供的核心功能。
            struts-default.xml中定义着struts-default这个包。而struts-default.xml是在我们的struts.xml加载之前加载。
          -->
        <package name="hello" namespace="/" extends="struts-default">
            <!--配置动作:配置我们的action
              name:动作名称
              class:动作全类名
              method:动作类中的方法名称。默认是public String execute(){}
              要求:
                 1.public的
                 2.返回值必须是String
                 3.没有参数
              -->
            <action name="helloworld" class="com.struts.action.HelloWordAction">
                 <!--最后的输出:响应
                   name:逻辑名
                 -->
                <result name="success">/index.jsp</result>
    
    
            </action>
    
        </package>
    
    
    </struts>

    六、Struts2的Action的创建:

         1.使用普通的java类创建

         2.使用一个普通的java类继承Action类

         3.使用一个普通的java类继承ActionSupport类

       

    package com.struts.action;
    
    /**
     * Action类
     */
    public class HelloWordAction {
        /**
         * action的默认执行方法:action会返回一个字符串   
         * Action的默认执行方法:execute
         * 返回值必须是一个String
         * @return
         * @throws Exception
         */
        public String execute() throws Exception{
            return "success";
        }
    
    }

       七、struts2Action方法的访问

        1.传统的访问方式:

           

      <!--struts2的传统访问方式-->
            <action name="helloworld" class="com.struts.action.HelloWordAction" method="hello">
    
                <result name="success">/index.jsp</result>
            </action>

    2.使用通配符的方式访问

    访问的路径和方法的名称必须要又某种联系)通配符就是 * 代表任意的字符

     <!--使用通配符方式-->
            <action name="hello_*" class="com.struts.action.HelloWordAction" method="{1}">
    
                <result name="success">/index.jsp</result>
    
            </action>

    配置文件中的

    hello_*可以匹配请求method属性的值使用{1}来代替,{1}就表示的是第一个*号的位置的值。

    3.动态方法访问:
    如果使用动态方法访问的方式我们需要配置一个常量:开启动态方法访问。

    <!--开启动态方法访问-->
        <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
     <!--配置动态访问-->
            <action name="hello" class="com.struts.action.HelloWordAction">
    
                <result name="success">/index.jsp</result>
            </action>


         

           

        

  • 相关阅读:
    2019黑龙江省大学生程序设计竞赛 赛后总结
    HZNU Training 4 for Zhejiang Provincial Collegiate Programming Contest 2019
    浙江大学第十九届图森未来杯大学生程序设计竞赛
    HZNU Training 2 for Zhejiang Provincial Collegiate Programming Contest 2019
    whu-contest-2019(online)
    HZNU Training 1 for Zhejiang Provincial Collegiate Programming Contest
    华为实习日记——第十九天
    华为实习日记——第十八天
    华为实习日记——第十七天
    华为实习日记——第十六天
  • 原文地址:https://www.cnblogs.com/wuzhilong/p/9883449.html
Copyright © 2020-2023  润新知