Struts2的经典入门

一:Struts2的起源与背景

在了解Struts2之前我们先来聊聊Struts1,我们都知道在很长的一段时间内,所有的MVC框架中,Struts1他是处于一个超级大咖的地位,无论是从市场角度和使用的用户的数量这个角度而言,Struts1它占用绝对地位,对于其他的MVC框架都不能和他媲美,但是Struts1作为一款优秀的MVC框架他可以很好的实现将控制与业务逻辑相分离,但他自身也存在一定的缺陷。

1.表现层支持单一:

Struts1框架只支持JSP作为其表现层使用,而很多的Java应用,在表现层技术选择时并不一定值使用JSP一种技术,可能会用到FreeMarker,PHP之类的技术等。

2.对Servlet API的依赖:

Struts1框架是基于Model II 模式开发而成的,因此他在开发中会运用到大量的Servlet API,而且我们都知道Servlet API 是要依赖于WEB容器进行初始化的,从而他进一步对WEB容器进行依赖。

3.不利于代码重用:

在Struts1开发的代码中除了自己自定义的类外,还必须使用Struts1中的某些类,这样会带来很多的弊端,与Struts1的类耦合在一起的代码很难再其他系统中进行二次重用。

所以根据以上Struts框架在设计上的缺点,Struts2以WebWork的设计思想为核心,WebWork虽然没有Struts1名气大但是在设计上他避免了S投入他说的弊端,它更强调系统之间的松耦合,使用拦截       器来实现控制,由于不在依赖Web容器,从而解决了框架对Servlet API紧密耦合。所以Strut2是吸收了Struts1的部分优点,建立了一个兼容Struts1和WebWork的MVC框架。

二:Struts2与其优势

Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点

Struts 2拥有更加广阔的前景,自身功能强大,还对其他框架下开发的程序提供很好的兼容性

Struts官网

http://struts.apache.org/

下载下来后的包:

apps目录:Struts2示例应用程序

docs目录:Struts2指南、向导、API文档

lib目录:Struts 2的发行包及其依赖包

src目录:Struts 2项目源代码

三:Struts2的初体验

1.在项目中引入Struts2

必须引入的包

struts2-core.jar——Struts2的核心包

xwork-core.jar——Command模式框架,WebWork和Struts2都基于xwork

commons-logging.jar——Java日志工具类包

freemarker.jar——模板引擎,一个基于模板生成文本输出的通用工具

ognl.jar——Object-Graph Navigation Language,表达式语言,用来获取和设置Java对象属性

可选包

antlr.jar——语法分析器

aopalliance.jar——AOP联盟标准接口

classworlds.jar——class对象管理

commons-beanutils.jar——Bean处理工具类包

commons-chain.jar——流程链处理模型,Struts2处理HTTP请求处理的基础机制

commons-collections.jar——Commons项目组中的一个各种集合类和集合工具类的封装

commons-digester.jar——解析xml转换成Java对象

commons-fileupload.jar——文件上传

commons-io.jar——IO工具类封装

commons-lang.jar——Commons项目中用来处理Java基本对象方法的工具类包

commons-logging-api.jar——Java常用日志工具调用,如通过API调用Log4J

commons-validator.jar——Java对象验证框架

json-lib.jar——用来映射JSON(JavaScript Object Notiation是一种文本格式)到Java Bean的Java类库

oro.jar——文本处理工具

sslext.jar——Struts框架的一个扩展可以让开发者配置Web应用程序在http与https协议之间进行自动转换(需配置)

插件包

struts2-embeddedjsp-plugin.jar——嵌入式JSP插件,可以让你从类路径或者Jar包里面调用JSP页面(官网翻译大概是这个意思)

struts2-convention-plugin.jar——用来实现Struts2零配置的插件包,可以结合这东西实现项目REST风格应用。

struts2-json-plugin.jar——Apache提供的JSON插件包

四:第一个Struts2程序

已我们最为熟悉的登录为例

1.新建一个web项目

2.引入所需jar包

3.在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_2_5.xsd"
    version="2.5">
    <display-name></display-name>
    <!--  -->
    <filter>
        <filter-name>struts2</filter-name>
        <!-- 使用Struts2的核心类库 -->
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <!-- 拦截所有的action -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
</web-app>

4.准备我们需要的实体类(用户)

package cn.work.entity;

//用户实体类
public class User {
    private String username;// 用户名

    private String password;// 密码

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

在Struts2中,可以直接使用Action类的属性来接收用户的输入,即当表单提交时,Struts2自动对请求参数进行转换,并对具有相同名字的Action属性进行赋值(通过setter方法)

在Struts2中,系统不会识别哪些属性用于接收请求参数,哪些属性用于输出处理结果。只要对属性设置了 setter和getter方法,该属性就可以被自动处理。

此外,Action类中还可以使用复杂的属性,如用户自定义的类,数组,集合对象等。

5.在src下创建名称为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.ui.theme" value="simple" />
    <constant name="struts.devMode" value="true" />
    <!-- package元素用于定义Struts2处理请求的逻辑单元 -->
    <package name="default" namespace="/" extends="struts-default">
        <action name="login" class="cn.work.action.LoginAction2">
            <result name="success">
                success.jsp
            </result>
            <result name="login">
                login.jsp
            </result>
            <result name="input">login.jsp</result>
        </action>
    </package>

</struts>

1.package元素用于定义Struts2处理请求的逻辑单元,name属性为必需的并且唯一,用来指定包的名称(被其他包引用),extends属性类似java的extends关键字,用于指定要扩展的包。

2.action元素用于配置Struts2框架的“工作单元”Action类。action元素将一个请求的URI(action的名字)对应到一个Action类。name属性是必需的,用来表示action的名字,class属性可选,用于设定Action类的全限定名。

3.result元素用来设定Action类处理结束后,系统下一步将要做什么。name属性表示result的逻辑视图名称,必需与Action类返回的字符串进行匹配,而result元素的值表示与逻辑视图名称对应的物理资源之间的映射,用来指定这个结果对应的实际资源的位置。

注:在struts.xml文件中,每一个result属性的name名称都要与Action中返回的逻辑名称保持一致,否则,程序在运行时将无法正确运行。

6.创建一个继承了Action接口的LoginAction类

package cn.work.action;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import cn.work.entity.User;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport implements Action {
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    private User user;

    private List<String> list;

    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public String execute() throws Exception {
        if (user.getUsername().equals("张总")&&user.getPassword().equals("521")) {

            /**
             * 1.Struts2访问ServletAPI对象
             * 方式一:
             **/
            //获取session
            Map<String, Object> session = ActionContext.getContext().getSession();
            //将值存入session
            session.put("username",user.getUsername());

            return SUCCESS;
        }else {

            return LOGIN;
        }
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    //数据校验
    public void validate(){
        if (this.user.getUsername().length()==0) {
            addFieldError("name2", "用户名不能为空");
        }
        if (this.user.getPassword().length()==0) {
            addFieldError("pwd2", "密码不能为空");
        }
    }

}

7.用于登录的login.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>登录页面</title>
</head>

<body>
    <div>
        <h1>用户登录</h1>
        <!-- 用于输出验证信息 -->
        <s:fielderror />
        <!-- 表单的提交 -->
        <s:form action="login.action" method="post">
            用户名:<s:textfield name="user.username" type="text" />
            密码:<s:textfield  name="user.password"type="password" />
            <s:submit type="submit" value="登录"/>
        </s:form>
    </div>
</body>
</html>

8.成功的success.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>成功页面</title>
</head>
<body>
    <h1>登录成功</h1>
    <div>欢迎您,${session.username}</div>
    <s:property value="user.username" />
    <s:property value="user.password" />
</body>
</html>

先这样吧!这就是Struts2的入门,以后再继续探索Struts2的奥秘。。。

时间: 2024-11-05 19:42:17

Struts2的经典入门的相关文章

Struts2的国际化入门

Struts2的国际化入门 Struts2国际化是建立在Java国际化的基础上的,一样是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息--整个过程与JAVA程序的国家化完全相同,只是Struts2框架对JAVA程序国际化进行了进一步封装,从而简化了应用程序的国际化. Struts2需要国际化的部分 a.类型转换: b.数据校验: c.验证框架xml配置文件的国际化:RegisterAction-

[转载]MongoDB开发学习 经典入门

如果你从来没有接触MongoDB或对MongoDB有一点了解,如果你是C#开发人员,那么你不妨花几分钟看看本文.本文将一步一步带您轻松入门. 阅读目录 一:简介 二:特点 三:下载安装和开启服务器 四:使用mongo.exe 执行数据库增删改查操作 五:更多命令 六:MongoDB语法与现有关系型数据库SQL语法比较 七:可视化的客户端管理工具MongoVUE 八:在C#中使用官方驱动操作MongoDB 九,在C#中使用samus驱动操作MongoDB 十:写个批处理,方便开启Mongodb服务

批处理经典入门教程!(从不懂到高手)

写这篇教程的目的,是让每一个看过这些文字的朋友记住一句话:如果爱可以让事情变的更简单,那么就让它简单吧!看这篇教程的方法 脚本之家补充说明:批处理相对来说是比较简单的语言,大家可以通过多写多看别人的实例来学习,不懂的百度一下. 这是一篇技术教程, 真心诚意会用很简单的文字表达清楚自己的意思,只要你识字就能看懂,就能学到知识.写这篇教程的目的,是让每一个看过这些文字的朋友记住一句话:如果爱可 以让事情变的更简单,那么就让它简单吧!看这篇教程的方法,就是慢!慢慢的,如同品一个女人.一杯茗茶,你会发现

【软帝学院】12道java经典入门算法题!

12道java经典入门算法题! [程序1]   题目:将一个数组逆序输出. 程序分析:用第一个与最后一个交换. 其实,用循环控制变量更简单: for(int k=11;k>=1;k--) System.out.print(myarr[k]+","); [程序2]   题目:取一个整数a从右端开始的4-7位. 程序分析:可以这样考虑: (1)先使a右移4位. (2)设置一个低4位全为1,其余全为0的数.可用~(~0 < <4) (3)将上面二者进行&运算. pu

12道java经典入门算法题!

12道java经典入门算法题![程序1] ? 题目:将一个数组逆序输出. ? 程序分析:用第一个与最后一个交换. ? 其实,用循环控制变量更简单:for(int k=11;k>=1;k--)System.out.print(myarr[k]+","); [程序2] ? 题目:取一个整数a从右端开始的4-7位. ? 程序分析:可以这样考虑: ? (1)先使a右移4位. ? (2)设置一个低4位全为1,其余全为0的数.可用~(~0 < <4) ? (3)将上面二者进行&a

struts2第一天——入门和基本操作

一.概述 1.运用场景: 应用于三层架构中web层的框架(显示层的运用),是经典MVC模型的web应用的变体. 2.与struts1的对比: struts2是在struts1基于webwork发展的全新的框架,完全脱胎换骨的全新框架 struts1代码严重依赖于servletAPI,属于侵入性框架. 3.解决的问题(解决的痛点): web阶段时一个模块(比如用户管理),如果有多个功能(登陆.注册等等),都要分别写一个servlet,容易发生servlet暴增的问题 struts2的解决思路: 对

struts2原理和入门程序

Struts2是一个MVC的Web应用框架,是在Struts1和WebWork发展起来的,以WebWork为核心,采取拦截器机制来处理用户请求. 原理图: 分析步骤: 1.用户发送一个请求 2.请求的目的肯定是去找Action,只是先经过一个过滤器 3.通过ActionMapper去查找Action 4.找到以后把请求委托给ActionProxy去处理 5.ActionProxy又通过ConfigurationManager去读取Struts.xml的配置文件 6.取到配置文件后,说明运行环境已

struts2框架快速入门小案例

struts2快速入门: index.jsp------>HelloAction--------->hello.jsp struts2流程 1.导入jar包 struts2的目录结构: apps: 例子程序 docs:文档 lib:struts2框架所应用的jar以及插件包 src:源代码 core 它是struts2的源代码 xwork-core struts2底层使用了xwork,xwork的源代码 注意:在struts2开发,一般情况下最少导入的jar包,去apps下的struts2-b

Struts2系列:入门

1.Struts简介和下载 Apache Struts is a free, open-source, MVC framework for creating elegant, modern Java web applications. It favors convention over configuration(约定大于配置), is extensible(可扩展) using a plugin architecture, and ships with plugins to support R