Struts2框架整理(HelloWorld环境搭建)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangligong/article/details/52887968
Struts2简介
      Struts2是一个工作在表现层的MVC的流程框架,它本质上相当于一个Servlet在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
     Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开。Struts相对于WebWork差别不大,相对于Struts1差别很大

MVC设计模式
     M(Model):模型包含数据模型和业务模型(JavaBean,业务逻辑)
     V(View):视图,将不同的数据展示到页面上
     C(Controller):控制请求处理(接收请求,处理请求,响应结果)它作为数据库与视图之间的一个媒介存在,将对数据库的操作和结果的显示分离。

MVC模式流程:
请求与响应的过程
【1】提交请求,提交数据
            方式:
 地址栏:http://ip:port/contextPath/index.jsp
 表单:收集客户端数据
 链接:<a href="/contextPath/userServlet?username=xiaoma&age=22">请求</a>
           异步JS:ajax
【2】接收请求,接收数据
            方式:
          String value = request.getParameter("key");
          将接收的数据封装成模型对象
【3】视图跳转,传递数据
             跳转方式:
          转发:
               request.getRequestDispatcher("资源路径").forWard(requeset,response);
          重定向:
               response.sendRedirect("资源路径");
  将数据保存到域对象中进行传递
            常用域对象
                request (HttpServletRequest ), session(HttpSession ) ,application(ServletContext )
【4】展示数据
          使用JSTL/EL在JSP页面展示保存在域对象中的数据

原生webMVC【2】【3】都是由Servlet完成

 框架
将通用代码封装起来,提供程序员开发使用,可以大大提高开发效率。
程序员只需要将开发重点放在业务逻辑的实现上,不用再去花费精力解决公共的问题了。
重复性,扩展性,稳定性...


Struts2具备核心功能
     ①可以将请求数据封装模型对象
     ②拦截器
文件上传
国际化
表单数据验证
类型转换
表单重复提交
...
     ③Action 处理请求,作用相当于Servlet
     ④Result 封装跳转方式
     ⑤支持多种视图技术:JSP , Freemarker
     ⑥ValueStack 存储数据
     ⑦Ognl 类似EL,用于操作数据
        ...

框架整体核心结构
     

apps框架给我们提供的学习案例
docs框架文档
lib框架类库
src框架源码


国际惯例---HelloWorld(使用Struts2框架)
     1.框架环境搭建
          ①导入 jar
               参考案例:\struts-2.3.15.3\apps\struts2-blank...
               
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.3.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
commons-logging-1.1.3.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
log4j-1.2.17.jar
ognl-3.0.6.jar
struts2-core-2.3.15.3.jar
xwork-core-2.3.15.3.jar

          ②新建一个conf专门放配置文件,文件名为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.devMode" value="true" />
  <package name="default" namespace="/" extends="struts-default">
          <!--这里在完成helloworld的时候写-->
  </package>
</struts>

         ③在web.xml中配置核心控制器
<!-- 核心控制器 -->
<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>

     2.完成HelloWorld
①index.jsp(发送请求)          
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!-- 使用绝对路径访问 -->
    <a href="${pageContext.request.contextPath}/hello">Hello</a>
</body>
</html>

               ②HelloWorldAction(处理请求)
package com.atguigu.action.hello;

public class HelloWorld {

    public String hello() {
        System.out.println("接收到请求");
        return "success";
    }
}

               ③配置action(就写在 struts.xml的page标签中,这主要完成页面转换
<?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.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">
        <action name="hello" class="com.atguigu.action.hello.HelloWorld" method="hello">
            <result>/success.jsp</result>
        </action>
    </package>
</struts>

               ④成功页面success.jsp(切换的页面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>向Struts2的工作者致敬</h1>
</body>
</html>


Action类定义规则
  ①Action程序代替Servlet来处理请求。
  ②就是一个普通的JavaBean程序,可以不用继承任何父类,可以不用实现任何接口。
  ③多实例。每一次请求都会创建一个新的Action对象。目的:解决线程安全问题。(Action类通过声明成员变量,来获取请求参数,当多个请求共用一个成员变量会发生线程安全问题)
  ④Action类中可以存在多个处理请求的方法。至少有一个。
  ⑤Action可以提供请求参数名称的set方法来接收请求参数。对于简单类型,可以可以自动的进行类型转换。
  ⑥处理请求的方法声明规则:
  必须public
  必须返回类型String
  必须是无参数的
  异常声明可以省略的
  方法名称,一般与<action>标签的method属性值一致。否则,会查找默认execute方法来处理请求。

ActionSupport(com.opensymphony.xwork2.ActionSupport)
   在编写Action类时,可以选择继承框架提供ActionSupport父类。
         ActionSupport实现了6个接口
              Action, 可以获取5个常量支持,代码编写规范化。
              Validateable ,  手动编码验证
              ValidationAware,  框架验证(通过框架配置文件来对表单数据进行验证)
              TextProvider, 用于操作国际化资源文件
              LocaleProvider, 用于获取Locale对象
               Serializable    支持可序列化
         当需要实现表单验证,国际化,序列化功能时,需要继承ActionSupport来获取框架支持。否则,不需要继承。

Strurts2框架配置解释
     1.常量标签解释
        常量标签:constant
          name=struts.devMode : 开发模式
             作用:①开发阶段一般设置为true,便于对问题的解决。
                  ②修改配置后,不需要重新启动服务器,框架会自动识别配置文件是否修改过,如果修改过会自动重新加载。
     
<constant name="struts.devMode" value="true" />


框架核心jar包(struts2-core-2.3.15.3.jar)中含有org/apache/struts2/default.properties属性文件。定义了框架默认用到属性值。
可以使用constant常量标签对框架默认属性值进行修改。

    2.package标签
  package标签用于管理action等配置。
  name : 设置包的名称。应该具有唯一性。
  namespace :名称空间.用于分区不同包下的同名的action.相当于访问的路径。
              如果定义了名称空间,那么,在请求的路径中就一定使用名称空间来访问action
  namespace+ action的name值就是请求路径

  extends : 用于包之间的继承。
  struts-default 包是框架定义的默认父包。我们的包一般都是需要继承这个父包的。否则,无法使用框架提供帮助。
             例如:结果类型,拦截器,拦截器栈,默认拦截器引用,默认的Action类引用就都无法使用了。
  abstract="true" 表示声明一个抽象的包。抽象包一般是用于给子包做继承使用的。不能定义action配置。

  <package name="default" namespace="/" extends="struts-default">
          <!--这里在完成helloworld的时候写-->
  </package>

   3.action标签
  action标签用于声明action的映射配置。将请求uri和目标Action类关联在一起。写在page标签中
       在同一个命名空间下,不能定义同名的action.否则,只执行最后一个。
  class : 处理请求Action类的全类名。
       class属性可以省略。默认值是com.opensymphony.xwork2.ActionSupport,默认处理请求方法execute
       当系统跳转成功页面,不需要进行任何业务逻辑处理时,可以通过默认ActionSupport进行请求处理。
  method :如果省略,那么,框架会通过默认的方法名称来执行请求处理,默认方法名称:execute

        <action name="hello" class="com.atguigu.action.hello.HelloWorld" method="hello">
            <!--这里写result标签-->
        </action>


     4.result标签
result标签用于声明结果映射配置。将Action类方法返回结果字符串,与一个物理视图文件关联在一起
name : 表示结果名称。与Action类方法的返回结果字符串相匹配。
name="success" 默认值,可以省略
type : 表示结果类型。对不同的跳转方式进行封装。
type="dispatcher" : 用于转发。默认值,可以省略。
type="redirect" : 用于重定向

     <result name="success" type="dispatcher">/success.jsp</result>


代码整理:
     
      web.xml配置

<?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"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>mystruts2_day01_helloword</display-name>
    <!-- 配置一个核心控制器 -->
    <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>
</web-app>

    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.devMode" value="true" />
    <!--
        package
        name用来定义包名,
        namespace定义请求路径(namespace+action的name属性值共同构成请求路径)
        extends="struts-default"必须写,否则不能获取Struts框架支持,例如request的处理,转发,重定向...
     -->
    <package name="com/atguigu/action/hello" namespace="/" extends="struts-default">
        <!--
           action标签
          name属性设置请求名,与namespace共同构成请求路径(SpringMVC中加在类上@RequestMapping+加在方法上的@RequestMapping共同构成请求路径)
          class表示方法所在的全类名,
          method定义处理请求的方法名
         -->
        <action name="hello" class="com.atguigu.action.hello.HelloWorld" method="hello">
            <!--
                name属性设置返回值,里面的文本框设置跳转页面
                type设置是重定向还是转发,默认是转发
     type="dispatcher"用于转发。默认值,可以省略。
     type="redirect"用于重定向
                type类型不能随便设置,必须是struts2-core下struts-default.xml中设置的
            -->
            <result name="success" type="redirect">/success.jsp</result>
            <!--重定向到目标资源
                这里指定目标资源的虚拟路径时,不能包含Web应用的虚拟路径,
                因为Struts2会自动添加,我们再加就是画蛇添足。
            -->
        </action>
    </package>
</struts>

               处理请求的Action类
package com.atguigu.action.hello;

public class HelloWorld {

    /**
     * Struts2通过定义成员变量(属性)来获取请求参数
     *  ①设置属性②定义set/get方法(Struts2通过使用setXXX方法给属性赋值,属性的名字不影响赋值操作)
     * 若成员变量进行共享会出现线程安全性问题,Struts2通过使用多实例的方式来解决
     * Struts2默认请求地址execute(返回成功页面)
     *
     */

    private int age;

    /**
     * 执行请求的方法,同时要在xml中配置
     * 何时,如何执行这个请求
     * @return
     */
    public String hello() {
        System.out.println("接收到请求");
        System.out.println("请求参数age=" + age);
        return "success";
    }

    public void setAge(int age) {
        this.age = age;
    }
}


猜你喜欢

转载自blog.csdn.net/wangligong/article/details/52887968