三大框架学习:Struts2简单入门(通过一个简单的登陆实例详解)

Struts2简单入门

前言:最近投了不少的简历,发现自己很多以前学过的东西有点淡忘了,所以就再次通读了一些书籍,温习了一下java的基础知识,在这里,先介绍一下Struts2的简单入门,主要涉及Struts1与Struts2的区别以及Struts2的开发过程,废话不多述,直接杠正面!使用的IDE是Myeclipse。

  1. Struts1入门
    ★Struts1是什么?工作原理?实现?
    ●学习一个框架,首先要搞清楚这个框架是什么?有什么用?
    Struts1是基于MVC的轻量级Web应用框架,所谓MVC,即Model模型、View视图、Controller控制器。其中模型用于表示业务数据,调用业务逻辑;视图则是用于显示,将数据展现在客户面前,一般用jsp和Struts提供的标签来实现;控制器则负责控制流程,由ActionServlet负责读取struts-config.xml配置文件,并通过其中的ActionMapping来查找到对应的Action。
    ●工作原理和实现在这里不做详细案例演示,仅仅以一个登陆案例作为牵引,首先我们给出一个登陆的界面,这个小案例配置了Struts1.2,配置文件也已经全部搞妥当,开发过程在这里不赘述,所以简述如下:Struts1.2的jar包Myeclipse中是有自动的,直接MyEclipse->add struts capabilities即可,选择对应的版本,然后写好一个login.jsp页面,一个welcome.jsp页面,一个loginAction.java、一个loginForm.java再外加一个配置文件,具体内容部多说,当我们运行这个登陆案例时候,填好相应的表单数据(这里是否要写js验证随自己)我们点击登陆按钮,struts会拦截.do的action即Struts在这里接收login.do的请求,找到相应的action,再到对应的类路径下找到类文件,通过struts-config.xml中的来对应ActionForm类,这里对应loginForm,Action处理完后返回ActionForward对象,对应中转发的URL,如果登陆成功则返回欢迎界面,登陆失败,返回登陆界面,其他细节这里不加赘述,大家可各自查阅相关资料。
    ★Struts1总结:优缺点
    ●优点:Struts1是一个基于J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。
    1)struts能充分满足应用开发的需求简单、易懂、敏捷迅速,功能强大。
    2)通过采用模型-视图-控制器(MVC)设计模式,使用struts可以开发使用 Java Servlets和JavaServer Pages的高性能的WEB应用程序。
    3)struts提供强大的自定义标签库(taglib),编程人员可以根据需要编写各种类型的标签。
    4)struts自带的validator框架和jstl标记库等,能为编程人员提供方便,提高编程效率。
    5)struts能很好的与 hibernate、spring整合。
    ●缺点:
    1)单元测试困难:HttpServletRequest和HttpServletResponse是由Servlet容器负责实例化的,因此Acton类的测试就依赖于Web容器,单元测试很难实现。
    2) Action是单例模式并且必须是线程安全的或者同步的。
    3)Struts1使用ActionForm对象捕获输入,所有的ActionForm必须继承一个基类。
    4)每更新一次struts-config.xml配置文件,须重新启动tomcat,而且配置繁琐。
  2. Struts2详解
    ★Struts2是什么?工作原理?实现?
    ●Struts 2 是 Struts 的下一代产品,是在 struts 1 和 WebWork 的技术基础上进行了合并的全新的Struts 2框架。其全新的 Struts 2 的体系结构与Struts 1的体系结构差别巨大:Struts 2 以 WebWork 为 核心 ,采用拦截器的机制来处理用户的请求,这样使得业务逻辑控制器能够与 Servlet API 完全脱离开,所以 Struts 2 可以理解为 WebWork 的更新产品。虽然从 Struts 1 到 Struts 2 有着太大的变化 ,但是相对于 WebWork,Struts 2的变化很小。说白了,struts2就是为我们封装了servlet,简化了jsp跳转的复杂操作,并且提供了易于编写的标签,可以快速开发view层的代码。
    ●环境搭建:首先,我们要找到Struts2使用需要的jar文件,下载官网下载地址下载的Struts2压缩文件解压后如下:三大框架学习:Struts2简单入门(通过一个简单的登陆实例详解)_第1张图片图上有个红色箭头遗漏了,那里应该是存放自己已经写好的案例的!接下来就将必须用到的几个jar包放进lib文件下:
    **struts2-core-2.0.11.1.jar
    xwork-2.0.4.jar
    commons-logging-1.0.4.jar
    freemarker-2.3.8.jar
    ognl-2.6.11.jar**
    freemarker提供了另一种展现方式
    ognl提供了OGNL表达式
    struts2-core提供struts2核心包
    struts2很多是基于webwork的,因此也需要xwork-core这个核心包
    导入完jar包之后就可以开始进行Struts.xml文件的配置了,首先将其粘贴到项目的src路径下,然后对它进行修改,再就可以开始进行案例开发了。
    ★Struts2简单入门(通过一个简单的登陆实例详解)
    ●首先,我们提供三个jsp页面,login.jsp、welcome.jsp、failure.jsp
    login.jsp:
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title><s:text name="loginPage"/></title>
</head>
<body>
<s:form action="login"><!--其实jsp页面中不用struts标签也好-->
    <s:textfield name="username" key="username"/>
    <s:textfield name="password" key="password"/>
    <s:submit key="login"/>
</s:form>
</body>
</html>

welcome.jsp:

<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
    <title><s:text name="succPage"/></title>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
</head>
<body>
    <s:text name="succTip">
        <s:param>${sessionScope.username}</s:param>
    </s:text><br/>
</body>
</html>

failure.jsp:

<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
    <title><s:text name="errorPage"/></title>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK">
</head>
<body>
    <s:text name="failTip"/>
</body>
</html>

当在login.jsp点击login按钮时,提交表单,这个action会被web.xml中配置的拦截器所拦截,众所周知struts2的核心控制器是StrutsPrepareAndExecuteFilter,这里涉及的拦截器很多,具体不详说,被拦截后,经过提取表单数据,并到struts.xml文件里找到对应的action,如此,便能找到对应的类,执行相应的java类文件,通过set和get得到表单数据,最后在execute()方法中进行相关的处理,通过返回的参数到struts.xml对应action下找到对应的页面跳转:
其中配置文件内容如下:
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>

struts.xml:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
    <!-- 指定全局资源文件 -->
    <constant name="struts.custom.i18n.resources" value="mess"/>
    <!-- 指定编码所使用的字符集 -->    
    <constant name="struts.i18n.encoding" value="GBK"/>
    <!-- 所有的Action定义都应该放在package下 -->
    <package name="test" extends="struts-default">
        <action name="login" class="com.test.action.LoginAction">
            <result name="error">/failure.jsp</result>
            <result name="success">/welcome.jsp</result>
        </action>
    </package>
</struts>

接下来编写LoginAction的代码,可以看到成功登陆后,程序把username写入session中。以便于我们在welcome.jsp中利用${sessionScope.username}取得用户名:

package com.test.action;

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

public class LoginAction extends ActionSupport {
    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;
    }
    public String execute() throws Exception {
        if (getUsername().equals("xiaochou") && getPassword().equals("226228")) {           ActionContext.getContext().getSession().put("username", getUsername());
            return SUCCESS;
        }else{
            return ERROR;
        }
    }
}

纵观整段代码,简单明了,没有啰嗦重复的语言,高效!
另外两个国际化标准的资源文件此处省略,不多写,这个开发过程简单明了,易懂!
★Struts2和Struts1比较?(这里摘自曾经学习时候的课件)
— 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。即Action接口不是必须实现的,一个包含execute方法的POJO类都可以用作Struts 2的Action。

— 线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts 1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。

— Servlet依赖方面的对比:Struts 1 Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。Struts 2 Action不再依赖于Servlet API,从而允许Action脱离Web容器运行,从而降低了测试Action的难度。 当然,如果Action需要直接访问HttpServletRequest和HttpServletResponse参数,Struts 2 Action仍然可以访问它们。但是,大部分时候,Action都无需直接访问HttpServetRequest和HttpServletResponse,从而给开发者更多灵活的选择。

— 可测性方面的对比:测试Struts 1 Action的一个主要问题是execute方法依赖于Servlet API,这使得Action的测试要依赖于Web容器。为了脱离Web容器测试Struts 1的Action,必须借助于第三方扩展:Struts TestCase,该扩展下包含了系列的Mock对象(模拟了HttpServetRequest和HttpServletResponse对象),从而可以脱离Web容器测试Struts 1的Action类。Struts 2 Action可以通过初始化、设置属性、调用方法来测试。

— 封装请求参数的对比:Struts 1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:ActionForm。普通的JavaBean不能用作ActionForm,因此,开发者必须创建大量的ActionForm类封装用户请求参数。虽然Struts 1提供了动态ActionForm来简化ActionForm的开发,但依然需要在配置文件中定义ActionForm;Struts 2直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐,实际上,这些属性还可以是包含子属性的Rich对象类型。如果开发者依然怀念Struts 1 ActionForm的模式,Struts 2提供了ModelDriven模式,可以让开发者使用单独的Model对象来封装用户请求参数,但该Model对象无需继承任何Struts 2基类,是一个POJO,从而降低了代码污染。

— 表达式语言方面的对比:Struts 1整合了JSTL,因此可以使用JSTL表达式语言。这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts 2可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此,Struts 2下的表达式语言功能更加强大。

— 绑定值到视图的对比:Struts 1使用标准JSP机制把对象绑定到视图页面;Struts 2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。

— 数据校验的对比:Struts 1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。Struts 2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。

— Action执行控制的对比:Struts 1支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action必须共享相同的生命周期。Struts 2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。开发者可以根据需要创建相应堆栈,从而和不同的Action一起使用。

你可能感兴趣的:(java,框架,struts2.0)