zoukankan      html  css  js  c++  java
  • Struts2入门1 Struts2基础知识

    Struts2入门1 Struts2基础知识 20131130

    代码下载: 链接: http://pan.baidu.com/s/11mYG1 密码: aua5

    前言:

             之前学习了Spring和Hibernate框架知识,因为Spring可以将Struts和Hibernate框架集成,所以还是要学习一些Struts框架技术。本章主要是Struts的简单介绍。

    1.Struts2概述

             Struts2是最流行的MVC框架技术,特使以WebWork和Struts1为基础,开发的新的框架技术,保留了Struts1的简单易用性,并且充分利用了WebWork的拦截器机制,也就是AOP的思想。

             Struts2中大量的使用拦截器来处理用户请求,从而允许用户的业务逻辑控制器和ServletAPI分离,用户的请求交给Struts2的核心控制器FilterDispatcher。FilterDispatcher根据请求调用对应的Action的execute()方法,并且根据处理结果生成响应的JSP页面。Struts2框架内置了很多的拦截器,这些拦截器组成一个拦截器链,拦截器会自动队请求进行处理。

             Struts2控制器组件是整个框架的核心,实际上,所有MVC框架都是以控制器组件作为核心的。Struts2的控制器组件有:FilterDispatcher和业务控制器Action组成。

    1.1FilterDispatcher         

    FilterDispatcher是一个Servlet过滤器,他是Struts2的核心组件,作用于整个Web应用程序,需要在web.xml中配置Struts2的FilterDispatcher:

    <?xml version="1.0" encoding="UTF-8"?>

    <web-app version="3.0"

        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_3_0.xsd">

        <filter>

            <filter-name>struts2</filter-name>

        <filter-class>org.apache.struts2.disaptcher.FilterDispatcher</filter-class>

        </filter>

        <filter-mapping>

            <filter-name>struts2</filter-name>

            <url-pattern>/*</url-pattern>

        </filter-mapping>

        <welcome-file-list>

            <welcome-file>index.jsp</welcome-file>

        </welcome-file-list>

    </web-app>

    上面配置了FilterDispatcher过滤器,他会对所有的请求都会过滤处理。任何需要与Web整合的MVC框架都是需要借助web.xml配置文件。通常MVC框架都需要在web应用中添加一个核心控制器。对于Struts2而言,就是加载FilterDispatcher组件。只要web应用加载了FilterDispatcher,FilterDispatcher就会加载对应的Struts2框架,因为FilterDispatcher是一个过滤器,Web应用加载FilterDispatcher只需要在web.xml中使用filter和filter-mapping元素配置FilterDispatcher即可。

    2.Action

             Action是Struts2的业务控制器

    package com.yang.stru2.action;

     

    public class LoginAction {

        private String userName;

        private String password;

       

        public LoginAction(){}

       

        public String getUserName(){return this.userName;}

        public void setUSerName(String userName){ this.userName = userName;}

        public String getPassword(){return this.password;}

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

       

        public String execute(){

            System.out.println("userName:" + userName);

            System.out.println("pasword:" + password);

            if("yang".equals(userName) && "12345".equals(password)){

                return "success";

            }

            return "error";

        }

    }

    上述类不需要继承Struts2的任何类或是实现任何几口,是一个完全的POJO,重用性很高。Struts2中的Action有如下优势:

    Action类完全是一个POJO,具有良好的代码重用性;Action类无需和ServletAPI耦合,因此无论是应用还是测试都是十分方便;Action中的execute()方法仅仅返回一个字符串作为处理结果,该处理结果可以映射带任何试图或者是另一个Action。

             实际上,Struts2应用中起作用的业务控制器不是用户定义的Action而是系统生成的Action代理类,该Action代理类以用户定义的Action为代理目标。

    1.3配置文件

             使用Struts2创建系统的Action代理的时候,在web.xml中配置Struts2的拦截器,同时还要使用Struts2的配置文件,此文件中需要对用户定义的Action进行相关信息的配置。配置文件有两种:

             配置Action的struts.xml

             配置Struts2的全局属性的struts.properties文件

    struts.xml

    在struts.xml配置文件总需要配置系统用到的Action,在配置Action的时候,需要制定该Action的实现,并指定该Action处理结果和视图资源之间的映射关系。

    <?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"/>

        <!-- Struts2 的 Action 都必须在package 里 -->

        <package name="com.yang.stru2.action" extends="struts-default" namespace="/admin">

            <!-- 定义一个login的Action,实现类是com.yang.stru2.action.LoginAction -->

            <action name="login" class="com.yang.stru2.action.LoginAction">

                <!-- 配置execute()方法返回值对应的页面 -->

                <result name="error">/error.jsp</result>

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

            </action>

        </package>

    </struts>

    上述的struts.xml文件中,声明了一个Action,并且执行了Action的实现类是LoginAction,同时将execute()方法的返回值和视图资源之间的映射关系

    struts.properties

    在这个文件中可以配置Struts2的全局属性

    #指定Web的默认编码集合,相当于调用HttpServletRequest的时候使用了setCharacterEncoding

    struts.il8n.encoding=utf-8

    #当修改struts.xml之后需要重新加载配置文件,在开发阶段打开

    struts.configuration.xml.reload=true

    #设置浏览器是否缓存静态诶荣,开发阶段最好关闭浏览器缓存

    struts.serve.static.browserCache=false

    1.4Struts2标签库

             Struts的一个重要的组成部分就是标签库,提供了非常丰富的功能,这些标签不仅提供了表示层数据处理,而且提供了基本的流程控制,还提供了国际化支持、Ajax技术等功能。通过struts2标签库,可以减少代码的编写。

    1.5Struts2的处理请求过程分析

    Struts2一般只是用于Web框架:

    1)客户段发出请求,比如/mypage.action

    2)这个请求经过核心控制器FilterDispatcher过滤处理,FilterDispatcher将请求转交给响应的Action代理;

    3)Action代理通过配置文件中的信息找到对应的Action类,创建Action对象并且调用对应的Action的代理

    4)在调用Action的过程前后,设计相关拦截器的调用。拦截器链自动对请求应用通用功能,比如自动化工作流、验证或者是文件上传。

    5)一旦Action执行完毕,Action的代理根据struts.xml中的配置信息找到execute()方法返回值对应的结果,返回结果通常是试图资源或者是另一个Action

    2.基于Struts2的一个简单的应用

    2.1配置应用环境

             将Struts2核心类库放到Web项目中的lib目录下面:

    all common package javaassist.jar

    freemarket.jar,

    ognl.jar

    struts2-core.jar,

    xwork.jar

    同时需要修改web.xml的配置文件,加入Struts2的核心控制器FilterDispatcher,配置文件见上面的配置文件(其实这个和Servlet的配置方式是一样的)

    2.2创建输出视图

    <%@ 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>Add JSP</title>

    </head>

    <body>

        <h1>Struts2 Add Function </h1>

        <form action="add.action" id="calcForm" method="post">

            <table>

                <tbody>

                    <tr>

                        <td>First Number:</td>

                        <td><input type="text" name="num1"/></td>

                    </tr>

                   

                    <tr>

                        <td>Second Number:</td>

                        <td><input type="text" name="num2"/></td>

                    </tr>

                    <tr>

                        <td><input type="submit" value=""/></td>

                    </tr>

                </tbody>

            </table>

        </form>

    </body>

    </html>

    表单提交的目标是add.action

    2.3实现业务逻辑类

    2.4实现业务逻辑类

    package com.yang.stru2.service.impl;

     

    public class Calculator {

        public double add(double a ,double b){

            return a+b;

        }

        public double substract(double a, double b){

            return a-b;

        }

        public double multiply(double a, double b){

            return a*b;

        }

        public double divide(double a, double b){

            return a/b;

        }

    }

    2.5实现业务控制器

    package com.yang.stru2.action;

     

    import com.opensymphony.xwork2.ActionContext;

    import com.yang.stru2.logic.Calculator;

     

    public class AddAction {

        private double num1;

        private double num2;

       

        public double getNum1(){return this.num1;}

        public void setNum1(double num1){this.num1 = num1;}

        public double getNum2(){return this.num2;}

        public void setNum2(double num2){this.num2= num2;}

        public String execute(){

            Calculator cal = new Calculator();

            double result = cal.add(num1, num2);

            ActionContext.getContext().getSession().put("result", result);

            return "cal";

        }

    }

    2.5配置业务控制器

    创建一个struts.xml在scr目录下面,对AddAction进行配置:

    <?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"/>

        <!-- Struts2 的 Action 都必须在package 里 -->

        <package name="com.yang.stru2.action" extends="struts-default">

            <action name="add" class="com.yang.stru2.action.AddAction">

                <result name="cal">/add_result.jsp</result>

            </action>

        </package>

    </struts>

    2.6创建结果视图

    <%@ 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>Add result</title>

    </head>

    <body>

        <h1>计算器结果</h1>

        <table>

            <tbody>

                <tr>

                    <td>FirstNumber:</td>

                    <td>${param.num1 }</td>

                </tr>

                <tr>

                    <td>Second Number:</td>

                    <td>${param.num2 }</td>

                </tr>

                <tr>

                    <td>Result:</td>

                    <td>${sessionScope.result }</td>

                </tr>

            </tbody>

        </table>

       

        <button onclick="history.go(-1)">Return</button>

    </body>

    </html>

    这样就可以运行了。

    调试程序:

    1.关于包添加的问题

             我们这种菜鸟刚接触这个框架的时候,想到的就是将所有的包都放到应用中,对于其他的框架,暂时没有发现什么错误,但是对于这个Struts2,如果我们将所有的包都放入到项目中,就会发现运行报错,其实我也不知道为什么,其中的很多的包都是没有用的。经常长时间的调试,我找到了这些包,虽然不是完全精确,但是相对比较精简了,很多教材中说,只添加核心的5个包就可以了,反正就是运行失败。

             我添加的包:将所有的common命名的开头的都添加进去,然后就是按几个比较关键的freemarket.jar, javaassist.jar, ognl.jar, struts2-core.jar, xwork-core.jar这些包就可以了。

    2.调试WARNING

             我们在web.xml配置文件中使用的是org.apache.struts2.dispatcher.FilterDispatcher,就会看提示,但不是使用红色的ERROR输出,提示我们这个FilterDispatcher已经过时了,推荐我们使用其他的FilterDispatcher。确实是这个样子的,我们根据WARNING提示,打开网页,推荐我们使用的是另一个比较新的FilterDispatcher,名字比较长

    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    YangTengfei

    2013.11.30

  • 相关阅读:
    高程图 GridMap
    VINS-Mono代码分析与总结(二) 系统初始化
    IMU误差模型与校准
    VINS-Mono代码分析与总结(一) IMU预积分
    XJTU 大一上
    iOS路由最佳选择是什么
    正向代理、反向代理、透明代理
    centos7国内镜像glbc版安装
    IntelliJ idea 中使用Git
    Mongo DB 2.6 需要知道的一些自身限定
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3473222.html
Copyright © 2011-2022 走看看