• 深入分析JavaWeb Item43 -- Struts2开发入门


    一、Struts2概述

    1、Struts2是什么?

    Struts2是一个M(模型—域–范围模型)V(View视图)C(控制器)框架(模型2)。框架都是一个半成品。

    提高开发效率。

    Struts1是一个MVC框架。非常流行。

    有非常大的缺点。

    此时一个webwork的框架设计超前,名气不是非常大。

    Struts1+webworkd=struts2。用的是struts1的名字,可是与sruts1没啥关系,struts2的核心是webwork框架。

    2、Struts2能干什么?

    web开发Strust2 核心功能

    • 获取请求參数
    • 封装到JavaBean
    • 验证和转换
    • 调用业务代码存数据
    • 转向某个页面展示结果

    是表现层的开发技术。

    (背景色为蓝色区域)

    这里写图片描写叙述

    3、Struts2入门简单原理图

    Filter VS Servlet
    过滤器要比Servlet要强大,开发中常常常使用Servlet作为控制器,Filter也能够作为控制器来使用。

    这里写图片描写叙述

    二、搭建struts2的开发环境

    1、下载地址:http://struts.apache.org

    2、解压后的文件夹结构:

    a) apps:框架本身提供一些案例(学习)
    b) docs:框架本身提供的文档(指南和API)。不保证100%正确
    c) lib:框架须要的jar包及第三方的jar包(不要全拷贝)
    d) src:源代码

    搭建步骤:

    a、新建一个JavaWebproject

    b、拷贝struts2运行所需的必要jar包。(方便办法:struts2发行包appsstruts-blank.war,拷贝当中的lib下的全部jar)

    这里写图片描写叙述

    • struts2-core-2.3.1.1.jar:Struts 2框架的核心类库
    • xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基于xwork
    • ognl-3.0.3.jar:对象图导航语言(Object Graph Navigation Language),
      struts2框架通过其读写对象的属性
    • freemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写
    • commons-logging-1.1.x.jar:ASF出品的日志包。Struts 2框架使用这个日志
      包来支持Log4J和JDK 1.4+的日志记录。
    • commons-fileupload-1.2.2.jar: 文件上传组件,2.1.6版本号后须要增加此文件
    • commons-io-2.0.1.jar:传文件依赖的jar包
    • commons-lang-2.5.jar:对java.lang包的增强,比方以下程序
    if(str!=null&&!str.equals("")){
    
    }
    //增强的
    if(StringUtils.isEmpty(str)){
    
    }
    • javassist-3.11.0.GA.jar:动态代理的开发包。日本鬼子弄的(Jboss)。Hibernate也会用到

    3、在web.xml中配置核心过滤器:StrutsPrepareAndExcuteFilter(框架提供)

      <filter>
        <filter-name>struct01</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>struct01</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

    4、在WEB-INFclasses文件夹下建立一个名称为struts.xml的配置文件。内容例如以下:(能够从struts2发行包appsstruts-blank.war中拷贝)。抄头超屁股。。。。。。

    。。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
    
    </struts>

    5、把应用部署到Tomcat中,启动Tomcat,假设没有报错,说明搭建成功

    三、第一个Struts2应用案例(编码步骤)

    1、编写2个jsp
    hello.jsp

      <body>
        <a href="${pageContext.request.contextPath}/hello.action">訪问第一个Struts2案例</a>
      </body>

    success.jsp

      <body>
        Struts2訪问成功
      </body>

    2、编写一个动作类(POJO,之前所谓的依照JavaBean规范编写的一个普通的类)

    package xgp.struts.actions;
    
    public class HelloAction {
        public String sayHello(){
            System.out.println("动作方法sayHello运行了,訪问成功。");
            return "success";
        }
    }
    

    3、在struts.xml配置。告知控制器该实例化那个类,调用该类的那个方法,依据方法的返回值转向哪个页面

    <?xml version="1.0" encoding="UTF-8" ?

    > <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="default" extends="struts-default"> <action name="hello" class="xgp.struts.actions.HelloAction" method="sayHello"> <result name="success" type="dispatcher">/success.jsp</result> </action> </package> </struts>

    4、訪问測试:

    http://localhost:8080/xgp.struts/hello.jsp

    这里写图片描写叙述

    运行步骤例如以下

    这里写图片描写叙述

    四、运行过程和原理(可能面试题)

    学习目标:熟知struts2的运行过程(下图记住)。源代码能够不看

    这里写图片描写叙述

    a、过滤器的初始化

    1、StrutsPrepareAndExecuteFilter是一个过滤器。过滤器就有初始化方法
    关键代码:57:dispatcher = init.initDispatcher(config);//初始化请求分发器。

    2、InitOperations:

    public Dispatcher initDispatcher( HostConfig filterConfig ) {
            Dispatcher dispatcher = createDispatcher(filterConfig);
            dispatcher.init();
            return dispatcher;
    }
    • init_FileManager();
    • init_DefaultProperties(); // [1]
    • init_TraditionalXmlConfigurations(); // [2]
    • init_LegacyStrutsProperties(); // [3]
    • init_CustomConfigurationProviders(); // [5]
    • init_FilterInitParameters() ; // [6]
    • init_AliasStandardObjects() ; // [7]

    Dispatcher:分发器

    private void init_TraditionalXmlConfigurations() {
            String configPaths = initParams.get("config");
            if (configPaths == null) {
                configPaths = DEFAULT_CONFIGURATION_PATHS;
            }
           String[] files = configPaths.split("\s*[,]\s*");
            for (String file : files) {
                if (file.endsWith(".xml")) {
                    if ("xwork.xml".equals(file)) {
                        configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));
                    } else {
                       configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
                    }
                } else {
                    throw new IllegalArgumentException("Invalid configuration file name");
                }
            }
        }

    (重要)结论:
    初始化过滤器时,会按顺序载入以下配置文件:

    ———-struts-default.xml,
    ———–struts-plugin.xml,
    ———-struts.xml这几个配置文件
    ———-struts-default.xml: struts2-core-**.jar包内部(框架内部的配置文件)
    当中定义了一些Bean对象;有一个抽象的package。内部有一些结果类型。一些拦截器的定义。还有拦截器小组的定义。

    默认的拦截器小组名字是defaultStack。
    ———struts-plugin.xml:struts2提供的插件中(插件内部提供)
    ———struts-xml:程序猿自定义的(开发中常常搞)

    b、过滤器的doFilter方法:用户的每次訪问

    1、ActionMapping mapping = prepare.findActionMapping(request, response, true);依据你的动作请求,从已经初始化好的配置文件里找相应的动作名称。

    2、Dispatcher:

    ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
                        namespace, name, method, extraContext, true, false);

    五、Eclipse编写struts.xml没有提示的问题

    原因:找不到约束文件
    解决:
    1、联网

    2、手工配
    a、eclipse的菜单:windowpreferences

    这里写图片描写叙述

    这里写图片描写叙述

    六、Struts2的配置文件

    1、default.properties:在struts2-core-**.jar的org.apache.struts包中
    关于Struts2一些常量配置(框架内部)

    2、struts-default.xml:在struts2-core-**.jar中。(框架内部)

    定义了一些bean;
    定义了一个抽象的包:struts-default 
    定义了一些结果视图 
    定义了一些拦截器和拦截器小组 
    

    3、struts-plugin.xml :在struts2的第三方插件中(插件内部。给插件用的)Struts2-**-plugin.jar中
    4、struts.xml:用户自己编写的(重点)
    5、struts.properties :用户自己编写的(类路径中,不须要)key和value的形式
    6、web.xml :struts2的一些配置能够写在这(Web应用中,不建议)

    结论:1~6:后面的配置文件内容,会覆盖前面的。

    比方:在struts.xml中覆盖default.properties中的内容,能够这么办:

    <constant name="struts.action.extension" value="do"></constant> 

    比方:在web.xml中把訪问的扩展名改为xgp

    <filter> 
        <filter-name>struts2</filter-name> 
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
        <init-param> 
            <param-name>struts.action.extension</param-name> 
            <param-value>xgp</param-value> 
        </init-param> 
      </filter> 
    <constant name="struts.devMode" value="true" />
    <!

    -- Struts2中的一个常量,表示开发模式。当其值为true,假设配置文件内容改变,框架会又一次载入而不需又一次启动服务器!-->

    6.1struts.xml中的package元素:

    Struts-default.xml—–中有这么个包——<package name="struts-default" abstract="true"></package>

    package:方便管理动作。作用:相应用中的动作进行模块化管理,就如同把类放在不同包中管理一样。


    属性:

    • name:配置文件里保证package的唯一
    • namespace:取值一般以”/”开头,它与动作名称组成完毕的訪问路径。

      默认值是””。

      http://域名+动作名称.action

    假设配置了namespace那么訪问资源时就要加上namespace:http://域名+namespace+动作名称.action

    • extends:父包名称。把父包中定义的内容全然集成下来。普通情况下,在struts2开发中须要继承(直接或间接)struts-default(struts-default.xml)
    • abstract:抽象包。

      抽象的东西就是设计被别人继承的。没有不论什么action子元素的packkage就能够定义为抽象的。
      package的namespace和动作訪问专题:(小难点)

    区分:namespace=”/”,实实在在的一个名称空间。绝对不是默认的:namespace=””或者不写,以下是详细的訪问流程图

    这里写图片描写叙述

    6.2 struts.xml中action元素的配置

    作用:定义动作类

    属性:

    • name:动作的名称,同一个包中的name必须唯一。
    • class:动作类的全名。

      可选属性。

      假设没有配置,则使用默认的class;默认值是ActionSupport Crtl+Shift+H搜索可得:com.opensymphony.xwork2.ActionSupport(可在源代码中找到)
      由于struts-default.xml有指定。

    <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
    • method:指定动作类中的哪个方法,可选的。

      默认值是execute

    小知识:

    能够在自己的package中通过以下标签,指定默认的动作类

    <default-class-ref class="com.itheima.action.HelloAction"></default-class-ref>

    6.3strutx.xml中的result元素的默认配置

    作用:定义动作类运行完毕后转向的结果视图
    属性:

    • name:结果视图的名称。与当前的动作类的动作方法返回值相应。默认值是success
    • type:结果视图的类型。默认是dispatcher(转发)

    来自:struts-default.xml中的结果视图的定义。

    6.4 struts2的一些常量含义及配置

    假设你要改变这些常量,则在外面的配置文件struts.xml(或者别的配置文件里)改动,覆盖这些框架的默认值:
    比方框架中
    struts.action.extension=action, 框架要处理的后缀名称。

    假设须要改成以*.do或者*.doo结尾,则能够在Struts.xml中配置:

    <constant name="struts.action.extension" value="do,doo"></constant>

    在struts.properties中配置例如以下

    struts.action.extension=do

    在web.xml中配置例如以下

    <filter>
        <filter-name>struct01</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>struts.action.extension</param-name>
            <param-value>do</param-value>
        </init-param>
     </filter> 

    这里要注意配置文件的优先级.

    常量

    • struts.i18n.encoding=UTF-8 框架使用的编码

    • struts.action.extension=action, 动作的訪问后缀。多个能够使用逗号分隔

    • struts.serve.static.browserCache=true 指示浏览器是否缓存资源
      (原理:三个响应消息头:response.setHeader():Expires Cache-Control Pragma)

    • struts.configuration.xml.reload = true 是否在更改了struts.xml后自己主动又一次载入。开发阶段实用。

    • struts.devMode = false 是否是开发模式。开发阶段建议为true。

      假设为true,struts.configuration.xml.reload就会为true

    • struts.ui.theme=xhtml 指定页面用的主题(struts标签时介绍)

    • struts.objectFactory = spring 默认情况。Action都是struts2框架给我们创建的(ObjectFactory,实例工厂)。与Spring框架整合时用。

    • struts.enable.DynamicMethodInvocation = false 是否同意DMI(动态方法调用:Dynamic Method Invocation)。

    • struts.multipart.maxSize=2097152 指定文件上传时的限制大小。2M

    6.4配置文件分模块化

    在项目开发中,为了更好的进行版本号控制,常常引入外部的配置文件(比方在struts.xml同级文件夹下建立一个user.xml。则仅仅需在

    <include file="user.xml"></include>
  • 相关阅读:
    IO(文件)处理
    集合 (set) 的增删改查及 copy()方法
    字典 (dict) 的增删改查及其他方法
    列表(List) 的增删改查及其他方法
    细数Python中的数据类型以及他们的方法
    CCNA基础 IP地址子网划分
    [转] SSH原理与运用(2):远程操作与端口转发
    记俩次连续失误操作造成的数据丢失损坏解决
    CentOS 下 MySQL DateBasic 抢救
    China Mobile 免流原理
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7345805.html
Copyright © 2020-2023  润新知