zoukankan      html  css  js  c++  java
  • 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>
    View Code

    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;
        }
    }
    View Code

    在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>
    View Code

    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", "密码不能为空");
            }
        }
        
        
    
    }
    View Code

    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>
    View Code

    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>
    View Code

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

  • 相关阅读:
    【外企面试】求一个链表中环的入口【强势证明】
    LeetCode5. Longest Palindromic Substring 最长回文子串 4种方法
    LeetCode4. Median of Two Sorted Arrays---vector实现O(log(m+n)--- findkth
    PAT1030 Travel Plan (30)---DFS
    LeetCode3. Longest Substring Without Repeating Characters
    LeetCode 题目总结/分类
    PAT1029.Median (25)
    PAT1028. List Sorting (25)---strcmp
    重新开始征程
    Dotnet文件格式解析
  • 原文地址:https://www.cnblogs.com/zhangzongle/p/5832540.html
Copyright © 2011-2022 走看看