Struts2学习

Posted 寒潭渡鹤影

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2学习相关的知识,希望对你有一定的参考价值。

 

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属性,直接在访问上写!

 

以上是关于Struts2学习的主要内容,如果未能解决你的问题,请参考以下文章

免费下载全套最新011Struts2视频教程+教学资料+学习课件+源代码+软件开发工具

[Struts2学习笔记] -- 输入校验

Struts2 学习

Struts2学习资料

Struts2学习第一天——struts2基本流程与配置

struts2框架学习