您的位置:首页 > 编程语言 > Java开发

【SSH进阶之路】Struts基本原理 + 实现简单登录(二)

2015-12-13 22:58 525 查看
上面博文,主要简单的介绍了一下SSH的基本概念,比较宏观,作为初学者能够有一个整体上的认识,个人认为对学习有很好的辅助功能,它不仅仅是一个“瞭望塔”,更是检验是否真正掌握所有内容的一个前提。

      Struts是基于MVC的框架,它进一步的对MVC进行了封装,它是怎么封装的,我们从先回顾一下MVC再到Struts,再用Struts给大家实现一个简单登录的实例。我们开始吧。

MVC

概念

       MVC全名是Model View Controller,是模型(model)—视图(view)—控制器(controller)的缩写,知道这么多就够了。

      大家都知道SUN公司对于MVC模式先后推出的一种规范,第一种是JSP Model1,第二种则是JSP Model2;Model1就是jsp + javabean,Model2就是jsp + servlet + javabean两种模式,前者是纯JSP,后者是简单的MVC。我们通过两个时序图来对比一下Model1和Model2:

Model1



优点:

1、编码简单

2、适合小型项目

 

缺点:

1、显示层与业务逻辑混在一起

2、jsp的职责不单一,职责过重,不便于维护

Model2



 

优点:

1、分层清晰,职责清楚,比较适合于大型项目架构

2、可扩展性强

3、实现了业务逻辑和显示分离,降低系统的耦合度

缺点:

1、增加了大量编写代码的工作量

对比

        Model1在一定程序上实现了MVC,即JSP是控制层与表示层合二为一了,这样的效果显然不如将控制层单独划分出来的好。而Model2则是将控制层(sevlet)单独的划分出来了,专门负责业务流程的控制,接受页面的请求,创建所需的javabean实例,并将处理后的数据再返回给JSP,渲染页面,这样分层清晰,可扩展性强,降低系统的耦合度。

Struts1

概念

       说概念真谈不上,Struts实质上就是采用JavaServlet/JSP技术,在Model2的基础上实现的一个MVC框架。

Struts1实现MVC的模型图

         


各部分的职责

虽然说Struts不难,但对于初学者而言,真正的弄明白Struts也是一件很简单的事,我们介绍一下几个关键点的职责,以便对struts的原理有更进一步的认识。

ActionServlet,前端控制器

1、根据相应的规则截取Http请求的URL

2、将Http请求分发到相应的Action处理

ActionForm,相当于实体

1、收集表单数据,将表单数据转换成相应的数据类型

Action,业务层控制器

1、 取得表单数据

2、调用业务逻辑

3、返回转向信息

我们再根据登录实例,对比上面的模型图,进一步理解一下Struts的基本原理,最后做一下总结。

 

登录实例

1、配置Struts

*拷贝struts相关的jar到WEB-INF/lib下

*在web.xml文件中配置ActionServlet

*提供struts-config.xml文件,需要放到WEB-INF下

如图所示:

         


2、编写代码

web.xml

[html] view
plaincopyprint?





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

<web-app version="2.5"   

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

  <welcome-file-list>  

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

  </welcome-file-list>  

    

  <!-- 标准 ActionServlet 配置文件-->  

  <servlet>  

    <servlet-name>action</servlet-name>  

    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>  

    <init-param>  

      <param-name>config</param-name>  

      <param-value>/WEB-INF/struts-config.xml</param-value>  

    </init-param>  

    <init-param>  

      <param-name>debug</param-name>  

      <param-value>2</param-value>  

    </init-param>  

    <init-param>  

      <param-name>detail</param-name>  

      <param-value>2</param-value>  

    </init-param>  

    <load-on-startup>2</load-on-startup>  

  </servlet>  

  

  

  <!-- 标准 ActionServlet Mapping配置信息 -->  

  <servlet-mapping>  

    <servlet-name>action</servlet-name>  

    <url-pattern>*.do</url-pattern>  

  </servlet-mapping>  

    

</web-app>  

struts-config.xml

[html] view
plaincopyprint?





<?xml version="1.0" encoding="ISO-8859-1" ?>  

  

<!DOCTYPE struts-config PUBLIC  

          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"  

          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">  

  

<struts-config>  

    <form-beans>  

        <form-bean name="loginForm" type="com.liang.struts.LoginActionForm"></form-bean>  

    </form-beans>  

      

    <action-mappings>  

        <action path="/login"   

                type="com.liang.struts.LoginAction"  

                name="loginForm"  

                scope="request"  

                >  

            <forward name="success" path="/login_success.jsp"></forward>  

            <forward name="error" path="/login_error.jsp"></forward>  

        </action>  

    </action-mappings>  

</struts-config>  

LoginAction

[java] view
plaincopyprint?





package com.liang.struts;  

  

import javax.servlet.http.HttpServletRequest;  

import javax.servlet.http.HttpServletResponse;  

  

import org.apache.struts.action.Action;  

import org.apache.struts.action.ActionForm;  

import org.apache.struts.action.ActionForward;  

import org.apache.struts.action.ActionMapping;  

/** 

 * 登录Action 

 * 负责取得表单数据,调用业务逻辑,返回转向信息 

 * @author liang 

 * 

 */  

public class LoginAction extends Action {  

  

    @Override  

    public ActionForward execute(ActionMapping mapping, ActionForm form,  

            HttpServletRequest request, HttpServletResponse response)  

            throws Exception {  

        LoginActionForm laf =(LoginActionForm)form;  

        //从ActionForm获取表单数据  

        String username = laf.getUsername();  

        String password = laf.getPassword();  

        UserManager userManager = new UserManager();  

        try{  

            //调用业务逻辑  

            userManager.login(username, password);  

            //跳转到成功页面  

            return mapping.findForward("success");  

        }catch(UserNotFoundException e){  

            e.printStackTrace();  

            request.setAttribute("msg", "用户不能找到,用户名称=[" + username + "]");  

        }catch(PasswordErrorException e){  

            e.printStackTrace();  

            request.setAttribute("msg", "密码错误");  

        }  

        //跳转到失败页面  

        return mapping.findForward("error");  

    }  

  

}  

LoginActionForm

[java] view
plaincopyprint?

package com.liang.struts;  

  

import org.apache.struts.action.ActionForm;  

/** 

 * 登录ActionForm,负责表单收集数据 

 * 表单的属性必须和ActionForm中的get和set的属性一致 

 * @author liang 

 * 

 */  

@SuppressWarnings("serial")  

public class LoginActionForm extends ActionForm {  

      

    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;  

    }  

}  

login.jsp

[java] view
plaincopyprint?





<%@ page language="java" contentType="text/html; charset=GB18030"  

    pageEncoding="GB18030"%>  

<!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=GB18030">  

<title>Insert title here</title>  

</head>  

<body>  

    <form action="login.do" method="post">  

        用户:<input type="text" name="username"><br>  

        密码:<input type="password" name="password"><br>  

        <input type="submit" value="登录"><br>  

    </form>  

</body>  

</html>  

PS:登录页面不难,主要是一定注意action的名字和ActionServlet的配置一致。

总结

       Struts很好的封装了MVC,界面从业务逻辑分离出来,灵活多变,同时,使用配置文件将控制层也变得更加灵活,降低了系统耦合。大道至简,一切变得轻松,简单了。

源码

留个悬念,下篇博文,我们一步步重构MVC实现Struts框架的流程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐