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>

 

 



     

       

 

 

 

 

 

    

 

posted @ 2018-11-06 18:37  龙之殇--疯狂者  阅读(301)  评论(0编辑  收藏  举报