• 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 plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="2.5"   
    3.     xmlns="http://<a href="http://lib.csdn.net/base/17" class="replace_word" title="Java EE知识库" target="_blank" style="color:#df3434; font-weight:bold;">java</a>.sun.com/xml/ns/javaee"   
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    7.   <welcome-file-list>  
    8.     <welcome-file>index.jsp</welcome-file>  
    9.   </welcome-file-list>  
    10.     
    11.   <!-- 标准 ActionServlet 配置文件-->  
    12.   <servlet>  
    13.     <servlet-name>action</servlet-name>  
    14.     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>  
    15.     <init-param>  
    16.       <param-name>config</param-name>  
    17.       <param-value>/WEB-INF/struts-config.xml</param-value>  
    18.     </init-param>  
    19.     <init-param>  
    20.       <param-name>debug</param-name>  
    21.       <param-value>2</param-value>  
    22.     </init-param>  
    23.     <init-param>  
    24.       <param-name>detail</param-name>  
    25.       <param-value>2</param-value>  
    26.     </init-param>  
    27.     <load-on-startup>2</load-on-startup>  
    28.   </servlet>  
    29.   
    30.   
    31.   <!-- 标准 ActionServlet Mapping配置信息 -->  
    32.   <servlet-mapping>  
    33.     <servlet-name>action</servlet-name>  
    34.     <url-pattern>*.do</url-pattern>  
    35.   </servlet-mapping>  
    36.     
    37. </web-app>  

    struts-config.xml

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="ISO-8859-1" ?>  
    2.   
    3. <!DOCTYPE struts-config PUBLIC  
    4.           "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"  
    5.           "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">  
    6.   
    7. <struts-config>  
    8.     <form-beans>  
    9.         <form-bean name="loginForm" type="com.liang.struts.LoginActionForm"></form-bean>  
    10.     </form-beans>  
    11.       
    12.     <action-mappings>  
    13.         <action path="/login"   
    14.                 type="com.liang.struts.LoginAction"  
    15.                 name="loginForm"  
    16.                 scope="request"  
    17.                 >  
    18.             <forward name="success" path="/login_success.jsp"></forward>  
    19.             <forward name="error" path="/login_error.jsp"></forward>  
    20.         </action>  
    21.     </action-mappings>  
    22. </struts-config>  

    LoginAction

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. package com.liang.struts;  
    2.   
    3. import javax.servlet.http.HttpServletRequest;  
    4. import javax.servlet.http.HttpServletResponse;  
    5.   
    6. import org.apache.struts.action.Action;  
    7. import org.apache.struts.action.ActionForm;  
    8. import org.apache.struts.action.ActionForward;  
    9. import org.apache.struts.action.ActionMapping;  
    10. /** 
    11.  * 登录Action 
    12.  * 负责取得表单数据,调用业务逻辑,返回转向信息 
    13.  * @author liang 
    14.  * 
    15.  */  
    16. public class LoginAction extends Action {  
    17.   
    18.     @Override  
    19.     public ActionForward execute(ActionMapping mapping, ActionForm form,  
    20.             HttpServletRequest request, HttpServletResponse response)  
    21.             throws Exception {  
    22.         LoginActionForm laf =(LoginActionForm)form;  
    23.         //从ActionForm获取表单数据  
    24.         String username = laf.getUsername();  
    25.         String password = laf.getPassword();  
    26.         UserManager userManager = new UserManager();  
    27.         try{  
    28.             //调用业务逻辑  
    29.             userManager.login(username, password);  
    30.             //跳转到成功页面  
    31.             return mapping.findForward("success");  
    32.         }catch(UserNotFoundException e){  
    33.             e.printStackTrace();  
    34.             request.setAttribute("msg", "用户不能找到,用户名称=[" + username + "]");  
    35.         }catch(PasswordErrorException e){  
    36.             e.printStackTrace();  
    37.             request.setAttribute("msg", "密码错误");  
    38.         }  
    39.         //跳转到失败页面  
    40.         return mapping.findForward("error");  
    41.     }  
    42.   
    43. }  

    LoginActionForm

    [java] view plain copy
     
     print?
    1. package com.liang.struts;  
    2.   
    3. import org.apache.struts.action.ActionForm;  
    4. /** 
    5.  * 登录ActionForm,负责表单收集数据 
    6.  * 表单的属性必须和ActionForm中的get和set的属性一致 
    7.  * @author liang 
    8.  * 
    9.  */  
    10. @SuppressWarnings("serial")  
    11. public class LoginActionForm extends ActionForm {  
    12.       
    13.     private String username;  
    14.       
    15.     private String password;  
    16.       
    17.     public String getUsername() {  
    18.         return username;  
    19.     }  
    20.     public void setUsername(String username) {  
    21.         this.username = username;  
    22.     }  
    23.     public String getPassword() {  
    24.         return password;  
    25.     }  
    26.     public void setPassword(String password) {  
    27.         this.password = password;  
    28.     }  
    29. }  


    login.jsp

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. <%@ page language="java" contentType="text/html; charset=GB18030"  
    2.     pageEncoding="GB18030"%>  
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    4. <html>  
    5. <head>  
    6. <meta http-equiv="Content-Type" content="text/html; charset=GB18030">  
    7. <title>Insert title here</title>  
    8. </head>  
    9. <body>  
    10.     <form action="login.do" method="post">  
    11.         用户:<input type="text" name="username"><br>  
    12.         密码:<input type="password" name="password"><br>  
    13.         <input type="submit" value="登录"><br>  
    14.     </form>  
    15. </body>  
    16. </html>  

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

    总结

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

    源码

    留个悬念,下篇博文,我们一步步重构MVC实现Struts框架的流程。

     
     
  • 相关阅读:
    [ABC142F] Pure
    [ABC141F] Xor Sum 3
    tarjan缩点
    LoadRunner录制:事务
    LoadRunner录制:脚本调试
    linux性能监控命令
    Python 3 解析 html
    Python 3 操作json 文件
    Python 数据驱动工具:DDT
    selenium 问题:OSError: [WinError 6] 句柄无效
  • 原文地址:https://www.cnblogs.com/java2016/p/5387459.html
Copyright © 2020-2023  润新知