[学习笔记] Struts2之Struts2入门

# 学习 # · 2021-03-20

Struts2概述

1、WebWork:

(1)由openSymphony组织开发,致力于组件化和代码重用的J2EEWeb框架。

(2)webwork灵活功能强大,是一个标准的command模式框架实现,并且完全从web层脱离出来。xwork提供了很多核心功能:前端拦截器(interceptor)运行时表单属性验证,类型转换,强大的表达式语言(OGNL the object graph notation language),IoC(inversion of control依赖倒转控制)容器等。

1、Struts框架概述:

(1)Struts2是一个基于MVC设计模式的Web层框架。

(2)Struts2是在Struts1和WebWork框架基础之上发展的全新的框架,但Struts2的内核相对于Struts1来讲已经发生了巨大的变化。

3、Struts2的优点:

(1)无需与ServletAPI 整合(例如写一个简单的class,看不到任何的response,或request,仅有一个execute())
优雅的请求参数封装(前台传递的参数,无需用getParameter()重复性的读取,只需准备好一个bean,自动封装,且数据类型自动转换,开发更加便捷)。

(2)灵活的视图技术(jsp,velocity,freeMarker,etc)

(3)丰富的表达式语言(EL,OGNL)

(4)机动、灵活、简单的配置

(5)线程安全的控制器(Action是线程安全的)

(6)霸气的插件(和Spring,hibernate整合方便)


第一个Struts2程序

1、在项目中引入Struts2:在Maven中添加依赖。

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.3.24</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

2、创建helloworld.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 导入Struts 2标签库 -->
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC 
    "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Hello World</title>
    </head>
    <body>
        <h1>Hello World</h1>
        <div>
            <h1>
                <!-- 显示Struts Action中message属性内容 -->
                <s:property value="message"/>
            </h1>
        </div>
        <hr />
        <div>
            <form action="helloWorld.action" method="post">
                请输入您的姓名:
                <input name="name" type="text" />
                <input type="submit" value="提交" />
            </form>
        </div>
    </body>
</html>

3、创建Action类,继承ActionSupport(或作为POJO、或实现xwork2.Action接口):用于对用户的请求做出处理。

public class HelloWorldAction extends ActionSupport {

    // 用户输入的姓名
    private String name = "";
    // 向用户显示的信息
    private String message = "";
    
    /**
     * execute方法,当Struts 2处理用户请求时,在默认配置下调用的方法。
     * @return
     */
    public String execute() {
        // 根据用户输入的姓名,进行“Hello,XXXX!”的封装
        this.setMessage("Hello,"+this.getName()+"!");
        // 处理完毕,返回“helloWorld”
        return "helloWorld";
    }
    
    // 省略getter/setter方法

}

(1)在Struts2中,可以直接使用Action类的属性来接收用户的输入。当表单提交时,Struts2会对具有相同名字的Action属性进行setter赋值。

(2)Action接口中常量字符串的逻辑含义:

常量逻辑含义
SUCCESS“success”程序处理正常
NONE“none”处理正常结束
ERROR“error”处理结果失败
INPUT“input”需要用户更多输入
LOGIN“login”需要正确登录

4、修改web.xml:将全部请求定位到指定的Struts2过滤器中。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
    <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>/*</url-pattern>
      </filter-mapping>
      <welcome-file-list>
        <welcome-file>/helloWorld.jsp</welcome-file>
      </welcome-file-list>
</web-app>

5、在src目录下创建Struts2配置文件struts.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>
    <!--
    package:定义Struts2处理请求的逻辑单元
    name:指定包的名称,被其他包引用
    extends:指定要扩展的包
    -->
    <package name="default" namespace="" extends="struts-default">
        <!--
        action:用于配置Action类
        name:action的名字
        class:可选项,设定Action类的全限定名
        -->
        <action name="helloWorld" class="com.aduo.action.HelloWorldAction">
            <!--
            result:设定Action类处理结束后系统下一步操作
            name:result的逻辑视图名称,必须与Action类返回的字符串进行匹配
            result元素值:指定结果对应的实际资源位置
            -->
            <result name="helloWorld">helloWorld.jsp</result>
        </action>
    </package>
</struts>

(5)编译部署并启动服务器。

4、Struts2应用的执行流程:

(1)客户端初始化一个指向Servlet容器(如Tomcat)的请求,浏览器发出请求至服务器。

(2)服务器接收后,根据web.xml的配置,将请求发送给指定的Struts2过滤器。

(3)过滤器根据struts.xml配置文件内容,选择Action类的对象,调用默认的execute()方法。

(4)根据execute()方法返回结果,根据Struts.xml中的配置找到对应的返回结果,并进行返回。


Struts2访问ServletAPI对象

1、使用ActionContext类获取ServletAPI对象对应的Map对象:

(1)获取HttpServletRequest对象对应的Map对象:

ActionContext ac = ActionContext.getContext();
Map<String,Object> request = (Map)ac.get("request");

(2)获取对应HttpSession对象的Map对象:

ActionContext ac = ActionContext.getContext();
Map<String,Object> request = (Map)ac.getSession();

(3)注意:完全解耦合的方式只能获得代表request、session、application的数据的Map集合,不能操作这些对象的本身的方法。

2、向Action注入ServletAPI对象对应的Map对象:

(1)implements实现接口:

org.apache.struts2.interceptor.RequestAware;
org.apache.struts2.interceptor.SessionAware;
org.apache.struts2.interceptor.ApplicationAware;

3、原生方式:

(1)得到HttpServletRequest、ServtetContext、HttpServletResponse对象:

HttpServletRequest request = ServletActionContext.getRequest();
ServtetContext context = ServletActionContext.getServtetContext();
HttpServletResponse response = ServletActionContext.getResponse();

(2)得到HttpSession对象:

HttpSession session = request.getSession();

(3)注意:原生的方式可以操作域对象的数据,同时也可以获得对象的方法。

4、Servlet是单例的,多个程序访问同一个Servlet只会创建一个Servlet的实例。Action是多例的,一次请求,创建一个Action的实例(不会出现线程安全的问题)。


Struts2数据校验

1、Struts2提供了数据验证机制:

(1)继承ActionSupport类来完成Action开发。

(2)ActionSupport类不仅对Action接口进行简单实现,同时增加了验证、本地化等支持。

2、实现Struts2数据校验:

(1)在Action中添加validate()方法:

/**
 * execute方法,当Struts 2处理用户请求时,在默认配置下调用的方法。
 * @return
 */
public void validate() {

    if(this.getUsername().length()==0){
        addFieldError("name","用户名不能为空");
    }
    if(this.getPassword().length()==0){
        addFieldError("pwd", "用户密码不能为空");
    }
}

(2)前端页面使用<s:fielderror/>返回校验错误信息:

<div>
    <s:fielderror/>
</div>

Struts2标签

1、Struts2标签分类:UI标签、通用标签。

2、Struts2在标签使用时需要导入标签库:

<%@ taglib prefix="s" uri="/struts-tags"%>

3、UI标签:

4、通用标签:

(1)if/elseif/else标签:

<s:if test="表达式">
    // 执行代码
    </s:if>
    <s:elseif test="表达式">
     ...
    </s:elseif>
    <s:else>
        ...
    </s:else>

(2)iterator迭代标签:

<s:iterator value="集合对象" status="迭代状态" id="迭代元素的ID">
    <s:property value="name"/>
</s:iterator>
如无特殊说明,本博所有文章均为博主原创。

如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/272/

评论