zoukankan      html  css  js  c++  java
  • 【SSH进阶之路】Struts基本原理 + 实现简单登录(二)

          上面博文,主要简单的介绍了一下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也是一件非常easy的事,我们介绍一下几个关键点的职责,以便对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

    <?

    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

    <?

    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

    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

    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

    <%@ 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框架的流程。


  • 相关阅读:
    AX 2012 Security Framework
    The new concept 'Model' in AX 2012
    How to debug the SSRS report in AX 2012
    Using The 'Report Data Provider' As The Data Source For AX 2012 SSRS Report
    Deploy SSRS Report In AX 2012
    AX 2012 SSRS Report Data Source Type
    《Taurus Database: How to be Fast, Available, and Frugal in the Cloud》阅读笔记
    图分析理论 大纲小结
    一文快速了解Posix IO 缓冲
    #转载备忘# Linux程序调试工具
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6782229.html
Copyright © 2011-2022 走看看