zoukankan      html  css  js  c++  java
  • Struts2学习(1)

    struts2概述

    1.struts2框架应用javaee三层结构中web层框架。

    2.strut2框架在struts1和webwork基础之上发展全新的框架。

    3.struts2解决的问题:

    4.版本:struts2.3.24

    5.web层常见框架

    (1)struts2

    (2)springMVC

    Struts2框架入门

    配置action类访问路径

    (1)创建struts2核心配置文件

    -核心配置文件名和位置是固定的,

    -位置必须在src下面,名称struts.xml

    (2)引入dtd约束

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

    struts.xml基本配置

    <struts>
        <package name="hellodemo" extends="struts-default" namespace="/">
        <!-- name:访问名称 -->
        <action name="hello" class="cn.itcast.action.HelloAction">
        <!-- 配置方法的返回值到页面 -->
        <result name="ok">/hello.jsp</result>
        </action>
        </package>
    </struts>

    配置struts2过滤器

     web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
    
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>*.action</url-pattern>
        </filter-mapping>
    </web-app>

    struts2执行过程

    过滤器在服务器启动时创建。

    1.在过滤器实现功能

    ①获取请求路径

    ②.得到路径里面的hello值

    2.①到src下面找struts.xml,使用dom4j解析

    ②拿着hello值到xml文件找action标签,匹配name属性值是否一样。

    3.匹配name属性值一样,都是hello

    找到name属性所在的action标签里面另外一个属性class值,就是action的全路径,得到的值就是action全路径。然后使用反射操作

    //通过字节码文件得到源码
    Class clazz = Class.forName("action全路径");
    //得到名称是execute的方法
    Method m = clazz.getMethod("execute");
    //方法执行
    Object obj = m.invoke();
    //第四步
    //得到action方法的返回值
    //在struts.xml文件中,找到action标签里面有result标签,匹配result标签里的name属性是否一样
    //如果一样,跳转到配置页面中

    web.xml里过滤器名字是:StrutsPrepareAndExecuteFilter(最好记住,面试可能要用)

    1.过滤器在服务器启动时创建,创建过滤器时候执行init方法。

    (1)在init方法中主要加载配置文件

    包含自己创建的配置文件和struts2自带的配置文件

    在Dispatcher中有代码

    private static final String DEFAULT_CONFIGURATION_PATHS = "struts-default.xml,struts-plugin.xml,struts.xml";
     try {
                init_FileManager();
                init_DefaultProperties(); // [1]
                init_TraditionalXmlConfigurations(); // [2]
                init_LegacyStrutsProperties(); // [3]
                init_CustomConfigurationProviders(); // [5]
                init_FilterInitParameters() ; // [6]
                init_AliasStandardObjects() ; // [7]
    
                Container container = init_PreloadConfiguration();
                container.inject(this);
                init_CheckWebLogicWorkaround(container);
    
                if (!dispatcherListeners.isEmpty()) {
                    for (DispatcherListener l : dispatcherListeners) {
                        l.dispatcherInitialized(this);
                    }
                }
                errorHandler.init(servletContext);
    
            }

    主要加载的配置文件

    主要关心的是struts.xml和web.xml。

    在服务器启动时会创建过滤器,然后加载struts.xml文件。

    Struts配置

    1.名称和路径是固定的。

    2.在配置文件中主要有三个表情package、action、result

     标签package

     1.package类似于代码包,区别不同的action,要配置action,必须首先写package标签,在package里面才能配置action

    2.package标签属性

    (1)name属性

    name属性值和功能本身没有关系的,在一个配置文件中可以写多个package标签,name属性值不能相同

    (2)extends属性

    -属性值固定的,struts-default

    -写了这个属性之后,在package里面配置的类具有action功能,写了这句话,里面配置的类才具有action的功能。

    (3)namespace属性

     -namespace属性值和action标签里面的name属性值构成访问路径。默认是"/"。

    标签action

    1.action标签配置action访问路径

    2.action标签属性

    (1)name属性

    -namespace属性值和action标签里面的name属性值构成访问路径

    -在package标签里面写多个action标签,但是action的name属性值不能相同的

    (2)class属性

    -action全路径

    (3)method属性

    -比如在action里面可以默认执行的方法是execute方法,但是在action里面可以写其他方法。

    -让action里面多个方法执行,使用method进行配置

    result标签

    1.根据action(其实就是一个类)的方法返回值,配置到不同的路径里面。

    2.result标签属性

    (1)name属性

    -和方法返回值一样

    <!-- 配置方法的返回值到页面 -->
    <result name="ok">/hello.jsp</result>

    (2)type属性

    -配置如何到路径中(转发或者重定向)

    -type属性的默认值  做转发操作

    转发(地址栏不会变)

    修改struts2默认常量值

    (1)常用的方式

    在struts.xml中进行配置

    <constant name="struts.i18n.encoding" value="UTF-8"></constant>

    (2)还有两种方式(了解)

    -在src下面创建struts.properties,进行修改

    -在web.xml进行配置

    介绍最常用常量

    struts.i18n.encoding

    (1)表单提交数据到action里面,在action可以获取表单提交数据

    (2)表单提交数据有中文,有乱码问题,解决:

    -post提交直接设置编码

    -get提交编码转换

    (3)如果在action获取表单通过post方式提交中文,中文乱码问题解决了,不需要自己处理问题。

    分模块开发

     1.单独写配置文件,把配置文件引入到核心配置文件中。

    <!-- 引入hello.xml文件  -->

    <include file="cn/itcast/action/hello.xml"></include>

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
    
    <!-- 第一步引入约束 -->
    <struts>
        <include file="cn/itcast/action/hello.xml"></include>
    </struts>

    在该目录下创建hello.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
    
    <!-- 第一步引入约束 -->
    <struts>
        <constant name="struts.i18n.encoding" value="UTF-8"></constant>
        <package name="hellodemo" extends="struts-default" namespace="/">
        <!-- name:访问名称 -->
        <action name="hello" class="cn.itcast.action.HelloAction">
        <!-- 配置方法的返回值到页面 -->
        <result name="ok">/hello.jsp</result>
        </action>
        </package>
    </struts>

    Action编写方式

     1.action编写有三种方式

    第一种 创建普通类,这个类不继承任何类,不实现任何借口

    第二种 创建类,实现接口 Action

    public class UserAction implements Action {
    
        @Override
        public String execute() throws Exception {
            // TODO Auto-generated method stub
            //return "success";
            return SUCCESS;
        }
    
    }

    这种方式很少用,因为实现接口,不管用不用里面的方法,都要实现它的方法。

    第三种 创建类,继承类ActionSupport

    public class PersonAction extends ActionSupport {
    
        @Override
        public String execute(){
            return SUCCESS;
        }
    }

    访问action的方法(重点)

    1.有三种方式实现

    第一种 使用action标签的method属性,在这个属性里面写执行的action的方法

    第二种 使用通配符方式实现

    第三种 动态访问实现(不用)

    (1)如果action方法有返回值,在配置文件中没有配置,出现错误。

    (2)在action里面的方法有返回值,如果有返回值时类型必须是String。

    (3)action里面的方法可以没有返回值,没有返回值,在result标签里就不需要配置。

    -把方法返回值写成void(不建议)

    -返回Action.NONE

    public class PersonAction extends ActionSupport {
    
        @Override
        public String execute(){
            return NONE;
        }
    }

    这样就无法跳转到指定页面了,在action里就可以不用谢<result/>标签了。

     1.创建action,创建多个方法

    public class BookAction extends ActionSupport {
    
        //添加
        public String add(){
            
            System.out.println("add.............");
            return NONE;
        }
        
        //修改
        public String update(){
            System.out.println("update...........");
            return NONE;
        }
    }

    2.使用method配置

    <package name="methoddemo" extends="struts-default" namespace="/">
            <!-- 有method属性:写要执行的action里面的方法的名称 -->
            <action name="addAction" class="cn.itcast.method.BookAction"
                method="add">
            </action>
            <!-- 执行update方法 -->
            <action name="updateAction" class="cn.itcast.method.BookAction"
                method="update">
    
            </action>
    </package>

    缺陷:action的每个方法都要配置,如果action里面有多个方法,配置很多的actions.

    使用通配符实现(重点)

     1.在action标签里面name属性,name属性值里面写符号*

     (1)*理解:表示匹配任意内容

    -比如访问hello,*可以匹配到

    -比如访问add,*可以匹配到

    <action name="book_*" class="cn.itcast.method.BookAction"
                method="{1}">
    </action>

    这两个网址都可以匹配到。

    book_*,里面的*相当于变成update

    最终执行action的方法名称是update

    在method属性里面写update就可以了。

    3动态访问

    不需要使用method属性,直接在访问上写!

  • 相关阅读:
    插入数据失败提示: Setting autocommit to false on JDBC Connection 自动提交失败
    MyBatis XML配置properties
    mybatis 测试输出SQL语句到控制台配置
    原创:mysql5 还原至mysql 8.0.11数据库链接配置提示错误(修改内容有三处
    idea 快捷键汇总
    maven依赖配置和依赖范围
    pom.xml 配置 收藏
    单词的提取
    UVA10815 安迪的第一个字典 Andy's First Dictionary
    UVA11054 Gergovia的酒交易 Wine trading in Gergovia
  • 原文地址:https://www.cnblogs.com/liaoxiaolao/p/9901650.html
Copyright © 2011-2022 走看看