分享知识-快乐自己:初始 Struts2 (基本概念)及 搭建第一个Demo

1):struts2 的基本概念:

  1-1):Struts2 是什么?

    1、Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。

  2、Struts 2是Struts的下一代产品,是在 struts 1 WebWork 的技术基础上进行了合并的全新的Struts 2框架。

    3、其全新的 Struts 2 的体系结构与 Struts 1 的体系结构差别巨大。Struts 2 以 WebWork 为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI

      完全脱离开,所以Struts 2可以理解为WebWork的更新产品。 虽然从 Struts 1Struts 2 有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

  1-3):传统jsp+servlet实现MVC的缺点:

    1、一个 servlet 对应一个逻辑方法,控制页面的跳转

    2、在 servlet 中获取用户提交的表单数据,手动封装成对象比较麻烦

    3、servlet 的配置文件都在web.xml中,导致web.xml文件代码多不易于维护

    4、传统方式实现国际化麻烦

  1-4):主流的MVC框架:

    struts 1 框架,是最早出现的一个MVC框架,企业级开发中,在03-07年期间基本上垄断了MVC框架的市场。

    但是,Struts1由于出现的早,核心设计思想跟不上时代,开发新功能难以胜任,目前基本上被淘汰,但是Struts这个名字已经深入人心,只要想学习MVC框架的人,首选就是Struts。

    JSF:是SUN官方的一个MVC框架,国内用的比较少,主要用在外包项目中。

    Struts 2 :该框架本来不是Apache公司的一个MVC框架,是OpenSymphony组织的一个MVC框架,本名叫WebWork,该框架出现的时间比较晚,设计架构比价适合web 2.0的开发规范。

    但是,该框架由于出现晚,并没有多少知名度。后来,WebWork直接交由Apache维护,apache借助于Struts的名气和WebWork的先进架构,直接把webWork框架改名为Struts2。

    Spring MVC:是Spring大框架中的一个MVC部分,是可以独立存在的。设计思想完全按照Spring的注入思想设计,目前很多软件中使用了Spring框架的企业MVC框架开始慢慢转向Spring mvc

  1-5):Struts2 与 Struts1的对比:

    在Action实现类方面:

     1、Struts1 要求Action类继承一个抽象基类;Struts1的一个具体问题是使用抽象类编程而不是接口。

     2、Struts2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制服务成为可能。

     3、Struts2 提供一个ActionSupport基类 去实现常用的接口。即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts2的Action。

    线程模式方面:

     1、Struts1 Action 是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。

     2、单例策略限制了Struts1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。

    Servlet依赖方面:

     1、Struts1 Action依赖于Servlet API,因为Struts1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。

     2、Struts2 Action 不再依赖于ServletAPI,从而允许Action脱离Web容器运行,从而降低了测试Action的难度。

        当然,如果Action 需要直接访问HttpServletRequest和HttpServletResponse参数,Struts2 Action仍然可以访问它们。但是,大部分时候,Action都无需直接访问

  1-6):MVC设计模式:

    模型 :Model:实体类,也就是把数据库表的字段映射为你的对象的各个属性封装数据,进行业务处理,返回处理结果

    视图 :View:层用于与用户的交互,通常用JSP来实现,展示界面

    控制器 :Controller:是Model与View之间沟通的桥梁,可以分派用户的请求并选择恰当的视图以用于显示,同时可以解释用户的输入并映射为模型层可执行的操作。

  回顾MVC执行原理:

  

2):搭建第一个Demo:

Struts2 执行原理图:

工作流程:

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2、这个请求经过一系列的过滤器(Filter)

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类

6、ActionProxy创建一个ActionInvocation的实例 ( 代理 )

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果返回结果通常是一个需要被表示的JSP或者FreeMarker的模版, 在表示的过程中可以使用Struts2框架中继承的

 标签;也可能是另外的一个Action链,在这个过程中需要涉及到ActionMappe

Demo 目录结构:

Web.XML:

<!DOCTYPE web-app PUBLIC        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>    <display-name>Archetype Created Web Application</display-name>

<!--Struts2 核心过滤器-->    <filter>        <filter-name>struts</filter-name>        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>struts</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>

</web-app>

POM 文件:

  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

    <dependencies>

        <!--测试JAR-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <!--javaee.jar包是支持javaweb编程的基础jar包,跟javase编程需要jre一样!-->
        <dependency>
            <groupId>javaee</groupId>
            <artifactId>javaee-api</artifactId>
            <version>5</version>
        </dependency>
        <!--Struts2-core核心-->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.4.1</version>
        </dependency>
        <!--xwork 的核心包,最主要的功能是 支持了过滤器(interceptor)。-->
        <dependency>
            <groupId>org.apache.struts.xwork</groupId>
            <artifactId>xwork-core</artifactId>
            <version>2.3.4.1</version>
        </dependency>
    </dependencies>

Fristaction:类

package com.gdbd.action;

import com.opensymphony.xwork2.Action;

/**
 * 第一天第一次
 * Action:零散属性自动装配:
 * 所谓的自动装配无非就是,在你表单提交的时候 name名字 与 Action属性名一致。底层自动做了映射
 *
 * @author asus
 */
public class Fristaction implements Action {

    private String messages;
    private String userName;
    private String userPwd;
  ...省略 Get Set 方法/***
     * 默认执行方法
     * @return
     * @throws Exception
     */
    @Override
    public String execute() throws Exception {return "index";
    }

    public String login() {
        System.out.println("携带参数:" + userName + "++" + userPwd + "-成功进入!!!!!!!!!!!!!");
        if ("1".equals(userName) && "1".equals(userPwd)) {
            return "login";
        } else {
            return "index";
        }

    }
}

说明:

实现Action 接口 重写execute() 默认执行的方法

在 Fristaction 类中我们还写了几个属性值,这几个属性值是用来演示 在我们提交表单的时候,name 属性名 与 Fristaction类中的字段名一致 就可以达到自动映射效果

FristactionBean:类

package com.gdbd.action;
import com.gdbd.bean.UserInfo;
import com.opensymphony.xwork2.Action;

/**
 * 封装Bean对象自动装配
 * 提交表单的时候,使用对象名点属性
 * @author asus
 */
public class FristactionBean implements Action {

    private String messages;
    private UserInfo userInfo;    ...省略 Get Set 方法/***
     * 默认执行方法
     * @return
     * @throws Exception
     */
    @Override
    public String execute() throws Exception {return "index";
    }

    public String login() {
        System.out.println("携带参数:" + userInfo.getUserName()+"++"+userInfo.getUserPwd() + "-成功进入!!!!!!!!!!!!!");
        if ("1".equals(userInfo.getUserName()) && "1".equals(userInfo.getUserPwd())) {
            return "login";
        } else {
            return "index";
        }

    }
}
package com.gdbd.bean;
import java.io.Serializable;
/**
 * user 实体类
 * @author asus
 */
public class UserInfo implements Serializable {

    private String userName;
    private String userPwd;
  ...省略 Get Set 方法
}

说明:

在 FristactionBean 类中植入了一个类对象,就是说我们在 实现 Action 接口的类中要是植入大量的 字段 肯定是不符合规范的。所以我们把他封装成了对象,在表单提交的时候我们需要 name 通过对象名点属性的方式

FristactionBeanModelDriven:类

package com.gdbd.action;

import com.gdbd.bean.UserInfo;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;

/**
 * 封装Bean对象自动装配
 * 实现ModelDriven 接口可以不使用对象点 属性名封装值
 * @author asus
 */
public class FristactionBeanModelDriven implements Action,ModelDriven<UserInfo> {

    private String messages;
    private UserInfo userInfo=new UserInfo();
  ...省略 Get Set 方法/***
     * 默认执行方法
     * @return
     * @throws Exception
     */
    @Override
    public String execute() throws Exception {return "index";
    }

    public String login() {
        System.out.println("携带参数:" + userInfo.getUserName()+"++"+userInfo.getUserPwd() + "-成功进入!!!!!!!!!!!!!");
        if ("1".equals(userInfo.getUserName()) && "1".equals(userInfo.getUserPwd())) {
            return "login";
        } else {
            return "index";
        }
    }

    @Override
    public UserInfo getModel() {
        return userInfo;
    }
}

说明:

实现  ModelDriven<UserInfo> 接口 并传入要封装的对象

在 FristactionBeanModelDriven 类中同样植入了一个类对象,必须事先创建实例,在我们提交表单的时候 就可以不用 对象名 点 属性了。

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:包,用于对Action进行封装
           name:包名,根元素下可以有多个包,彼此不能重名
           extends:继承,用于指定继承的包,相当于将继承包下的配置信息复制到当前包
           namespace:命名空间,用于规定Action的访问路径,必须“/”开头
      -->
    <package name="default" namespace="/" extends="struts-default">
        <!--action:业务控制器,用于注册业务控制器组件
           name:action名称,用于规定Action的访问路径
           class:业务控制器组件,用于指定业务控制器对应的类
           method:方法,用于指定访问当前action时要调用的方法
           *请求URL:http://ip:port/projectName/namespace/ActionName.action
       -->
        <action name="index" class="com.gdbd.action.Fristaction">
            <!--result:输出组件,用于转发、重定向、直接输出
               name:名称,一个action下可以有多个result,彼此不能重名
               默认值转发,元素内设置转发的页面
           -->
            <result name="index">/index.jsp</result>
        </action>
        <!--自动装配Action 属性值-->
        <action name="login" class="com.gdbd.action.Fristaction" method="login">
            <result name="login">/main.jsp</result>
            <result name="index">/index.jsp</result>
        </action>
        <!--封装javaBean 自动封装javaBean属性值-->
        <action name="loginBean" class="com.gdbd.action.FristactionBean" method="login">
            <result name="login">/main.jsp</result>
            <result name="index">/index.jsp</result>
        </action>
        <!--封装javaBean 实现ModelDriven接口不用点属性值:自动封装javaBean属性值-->
        <action name="loginBeanModelDriven" class="com.gdbd.action.FristactionBeanModelDriven" method="login">
            <result name="login">/main.jsp</result>
            <result name="index">/index.jsp</result>
        </action>

    </package>

</struts>

index.jsp:

<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
  Created by IntelliJ IDEA.
  User: asus
  Date: 2018/11/13
  Time: 12:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>第一天第一次测试</title>
</head>
<body>
<a href="index?messages=123">点击我进行测试哦</a>
<h1>xxx--<s:property value="messages"/>--xxx</h1>
<fieldset>
    <legend>Action:零散属性自动封装</legend>
    <s:form name="form1" method="post" action="login">
        用户名:
        <s:textfield name="userName"></s:textfield>
        <br/>
        密码:
        <s:password name="userPwd"></s:password>
        <s:submit value="登陆"></s:submit>
    </s:form>
</fieldset>
<br/>
<fieldset>
    <legend>Action:封装javaBean自动封装值</legend>
    <s:form name="form2" method="post" action="loginBean">
        用户名:
        <s:textfield name="userInfo.userName"/>
        <br/>
        密码:
        <s:password name="userInfo.userPwd"/>
        <s:submit value="登陆"></s:submit>
    </s:form>
</fieldset>
<br/>
<fieldset>
    <legend>Action:封装javaBean 实现ModelDriven接口不用点属性值:自动封装javaBean属性值</legend>
    <s:form name="form3" method="post" action="loginBeanModelDriven">
        用户名:
        <s:textfield name="userName"/>
        <br/>
        密码:
        <s:password name="userPwd"/>
        <s:submit value="登陆"></s:submit>
    </s:form>
</fieldset>
</body>
</html>

main.jsp:

<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
  Created by IntelliJ IDEA.
  User: asus
  Date: 2018/11/13
  Time: 12:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>第一天第一次测试</title>
</head>
<body>
<h1>成功</h1>
</body>
</html>

 源码下载地址:https://github.com/MlqBeginner/BlogGardenWarehouse/blob/master/StrutsDay01.rar

 --欢迎评论:若有不足之处多多指教

Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear.

面对过去无怨无悔,把握现在充满信心,备战未来无所畏惧。保持信念,克服恐惧!一点一滴的积累,一点一滴的沉淀,学技术需要不断的积淀!

原文地址:https://www.cnblogs.com/mlq2017/p/9963603.html

时间: 2024-10-13 19:01:55

分享知识-快乐自己:初始 Struts2 (基本概念)及 搭建第一个Demo的相关文章

分享知识-快乐自己:初识 Hibernate 概念片(一)

1):什么是 Hibernate? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行, 使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的

分享知识-快乐自己:Struts2文件上传及文件下载

1)Struts2单文件上传 action:类文件 package com.mlq.action; import com.opensymphony.xwork2.ActionSupport; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import java.io.File; import java.io.IOException; /** * Struts2:单文件

分享知识-快乐自己:Struts2 (常用的 constant 总结)

<?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> <!-- 把它设

如何自学Struts2之Struts2架构和环境搭建[视频]

如何自学Struts2之Struts2架构和环境搭建[视频] 之前写了一篇"打算做一个视频教程探讨如何自学计算机相关的技术",昨天晚上刚好有点时间,先做两个视频: http://v.youku.com/v_show/id_XODkyMTczMzMy.html 明天就回家过年了,家里没网络,等回来上海再继续弄吧,先给大家拜个早年,祝新春快乐,阖家幸福,事事如意!

SSH(Struts2+Spring+Hibernate)框架搭建流程&lt;注解的方式创建Bean&gt;

此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblogs.com/wkrbky/p/5912810.html 一.Hibernate(数据层)的搭建: 实现流程 二.Spring(注入实例)的使用: 实现流程 三.Struts2(MVC)的搭建: 实现流程 这里注意一点问题: Struts2与Hibernate在一起搭建,antlr包,有冲突.MyE

【GlusterFS学习之一】:GlusterFS分布式文件系统的基本概念及搭建

2.GlusterFS的部署方法. 操作系统: centos6.4: lsb_release -a 一共有三台机器: client: 10.23.85.47 glusterA server: 10.23.85.48 glusterB 10.23.85.49 glusterC glusterfs源代码:http://yunpan.cn/cVHsYCHzGGe43(提取码:710e)(代码版本为3.6.3) glusterfs ,fuse(http://pan.baidu.com/s/1geInpV

分享知识-快乐自己:论Hibernate中的缓存机制

Hibernate缓存 缓存: 是计算机领域的概念,它介于应用程序和永久性数据存储源之间. 缓存: 一般人的理解是在内存中的一块空间,可以将二级缓存配置到硬盘.用白话来说,就是一个存储数据的容器.我们关注的是,哪些数据需要被放入二级缓存. 缓存作用: 降低应用程序直接读写数据库的频率,从而提高程序的运行性能.缓存中的数据是数据存储源中数据的拷贝.缓存的物理介质通常是[内存]. Hibernate缓存分类: 1):Session缓存(又称作事务缓存):Hibernate内置的,不能卸除. 缓存范围

分享知识-快乐自己:oracle表分区详解

从以下几个方面来整理关于分区表的概念及操作: 1)表空间及分区表的概念: 2)表分区的具体作用: 3)表分区的优缺点: 4)表分区的几种类型及操作方法: 5)对表分区的维护性操作: 1):表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间. 分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区. 表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理

分享知识-快乐自己:IO流基本操作

点我参考常用API: IO图解: 相关理论: 流的概念和作用: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类: 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流: 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表. 字节流和字符流的区别