• 【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框架的流程。


  • 相关阅读:
    利用console控制台调试php代码
    数据库比对脚本(PHP版)
    Symfony框架系列----1.入门安装
    Symfony框架系列----常用命令
    Symfony命令行
    Linux SCP指令
    Linux 搭建SVN服务器
    Linux下 保存 git账号密码
    js 视差滚动 记录备份
    移动端 -webkit-user-select:text; ios10 bug 解决方案
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7078147.html
Copyright © 2020-2023  润新知