新手学Struts(一)----JSP+Servlet讲解MVC实现原理

简介: <div class="markdown_views"><p></p><div class="toc"><div class="toc"><ul><li><a href="#mvc%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86">MVC基本原理</a><ul><li><a href="#%E4%B8%80%E4%B8%AA%E7%AE%8

    最近在学SSH(Struts+ Hibernate+Spring),这也算是一个比较经典的框架了,之前都是看人家大牛说这个框架,那个框架,说的真溜,自己也是佩服的五体投地啊~~

这里写图片描述

    现在开始自己也要捣鼓捣鼓这些东西,还是有点小激动哒~~,Struts是基于MVC框架实现的,今天主要讲讲Struts的实现过程。

MVC基本原理


    MVC框架,相信大家也都已经耳熟蓝(能)翔(详)了!

这里写图片描述

  • 1、终端接受到用户的请求,然后转发给Controller进行处理。
  • 2、控制器接收到用户的请求后,确认采用什么样的业务逻辑来处理该请求,并将该请求转给相应的业务请求来进行处理。
  • 3、模型中包含处理该用户请求的所有业务组件,并且也执行用户所需要的全部数据存取,代表终端用户查询检索出的任何数据都被打包返回给控制器。
  • 4、控制器在经过业务的处理之后确定去调哪一个视图,并将处理后的数据传到视图上去,显示视图给用户。
        

一个简单的例子

    不灵活的Servlet的实现:

package com.bjpowernode.servlet;


import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String requestURI= request.getRequestURI();
        System.out.print("requestURI"+requestURI);
        String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
        System.out.println("path="+path);

        //获取界面的用户名
        String username=request.getParameter("username");
        UserManager userManger=new UserManager();
        String forward="";

        //通过截取url来判断执行的是什么方法
        if("/servlet/delUser".equals(path)){
            userManger.del(username);
            //页面跳转
            forward="/del_success.jsp";
        }else if("/servlet/addUser".equals(path)){
            userManger.add(username);
            //页面跳转
            forward="/add_success.jsp";
        }else if("/servlet/modifyUser".equals(path)){
            userManger.modify(username);
            //页面跳转
            forward="/modify_success.jsp";
        }else if("/servlet/queryUser".equals(path)){
            List userList=userManger.query(username);
            request.setAttribute("userList", userList);
            //页面跳转
            forward="/query_success.jsp";
        }else{
            throw new RuntimeException("请求失败!");
        }
        //统一进行跳转
        request.getRequestDispatcher(forward).forward(request,response);


    }


    @Override  
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }

}

    配置文件:

<?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">
  <display-name></display-name>
  <servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.bjpowernode.servlet.TestServlet</servlet-class>
  </servlet>


  <!-- 具体怎么访问 -->
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <!-- <url-pattern>/servlet/TestServlet</url-pattern> -->
     <url-pattern>*.action</url-pattern>
  </servlet-mapping>    


  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

当用户发送请求时,比如:(http://localhost:8080/test_servlet/servlet/queryUser.action),然后根据有一定特点的URL来访问相应的Servlet。
    在上边的例子中的配置文件可以看出,URL连接的尾部为*.action,当用户访问该连接的时候,就会截取相应的URL段(servlet/…),然后根据截取的这一段来进行判断和页面转向。
    看上边的代码明显的可以看出其中的缺陷,代码中有大量的if…else语句,不稳定,如果说想要添加新的连接的时候,就要在不断的添加新的if…else语句,还有就是在页面跳转的时候,如果页面的名称换掉了,那么还要手动的去代码中修改,我的天哪,真是太麻烦了!

改良的例子

    由于if…else语句太多,造成一定的不稳定,在这基础上抽出一个接口,然后把具体的业务的实现封装到单独的类里面,:

这里写图片描述

    具体的实现代码如下:

@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String requestURI= request.getRequestURI();
        System.out.print("requestURI"+requestURI);
        String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
        System.out.println("path="+path);


        Action action=null;
        //通过截取url来判断执行的是什么方法
        if("/servlet/delUser".equals(path)){
            action=new DelUserAction();
        }else if("/servlet/addUser".equals(path)){
            action=new AddUserAction();     
        }else if("/servlet/modifyUser".equals(path)){
            action=new ModifyUserAction();   
        }else if("/servlet/queryUser".equals(path)){
            action=new QueryUserAction();    
        }else{
            throw new RuntimeException("请求失败!");
        }

        String forward=null;

        try{
            forward=action.execute(request, response);
        }catch(Exception e){
            e.printStackTrace();
        }
        //进行统一转向
        request.getRequestDispatcher(forward).forward(request, response);
    }

    经过以上的改良,这个已经算是一个基本的MVC的实现了,有专门的前台UI界面,Servlet负责URL的截取,业务的处理以及页面的转向。对功能的实现进行了很好的分离,从而来保证其稳定性和扩展性。
    时序图如下:

Created with Raphaël 2.1.0 web客户端 web客户端 Tomcat Tomcat HttpServletRequest HttpServletRequest HttpServletResponse HttpServletResponse FrontControllerServlet FrontControllerServlet Action Action 视图 视图 1、request(请求是有规则的,如*.action或*.do) 2、new 3、new 4、doGet/doPost 5、截取URL 6、根据URL分发到相应的Action 7、读取配置文件 8、new 9、execute(request/response) 10、返回转向信息 11、根据返回信息转向到相应的视图 12、渲染视图 13、response

Struts基本流程的实现


    下面来说一说Struts的基本流程是怎么实现的,也就是MVC的基本流程,和上面的时序图类似:

  • 1、web客户端发送请求给Servlet(要遵守一定的规则)
  • 2、Servlet截取URL,读取配置文件(struts-config.xml)中的这次请求相关的Action
  • 3、然后去调用相应的Action,分发(dispatch)
  • 4、调用模型层,获取相应的数据,并返回给Servlet
  • 5、转向,跳转到相应的jsp界面
  • 6、渲染页面,返回给客户显示

    流程如下:

这里写图片描述


源码打包下载:JSP+Servlet讲解MVC实现原理

JSP+Servlet讲解MVC实现原理(改良版)

相关文章
|
1月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
69 0
|
2月前
|
存储 前端开发 Java
JavaWeb基础6——Request,Response,JSP&MVC
Request继承体系、获取请求头行体的方法、IDEA使用模板创建Servlet、请求参数中文乱码解决、请求转发、Respones重定向、Response响应字节字符数据、JSP、EL 表达式、JSTL标签、MVC模式和三层架构
JavaWeb基础6——Request,Response,JSP&MVC
|
3月前
|
SQL Java 数据库
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
该博客文章介绍了在JSP应用中使用Servlet查询SQL Server数据库的表信息,并通过JavaBean封装图书信息,将查询结果展示在Web页面上的方法。
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
|
3月前
|
供应链 前端开发 Java
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
这篇文章通过一个服装库存管理系统的实例,展示了在Spring Boot项目中使用Ajax、JSON、layui、MVC架构和iframe等技术,涵盖了注册登录、权限管理、用户管理、库存管理等功能,并提供了系统运行环境和技术要求的详细说明。
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
|
3月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
29 0
|
5月前
|
自然语言处理 前端开发 Java
Servlet与JSP:Java Web开发的基石技术详解
【6月更文挑战第23天】Java Web的Servlet与JSP是动态网页的核心。Servlet是服务器端的Java应用,处理HTTP请求并响应;JSP则是结合HTML与Java代码的页面,用于动态内容生成。Servlet通过生命周期方法如`init()`、`service()`和`destroy()`工作,而JSP在执行时编译成Servlet。两者在MVC架构中分工,Servlet处理逻辑,JSP展示数据。尽管有Spring MVC等框架,Servlet和JSP仍是理解Web开发基础的关键。
105 12
|
5月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
110 10
|
5月前
|
缓存 小程序 前端开发
Java服务器端技术探秘:Servlet与JSP的核心原理
【6月更文挑战第23天】Java Web开发中的Servlet和JSP详解:Servlet是服务器端的Java小程序,处理HTTP请求并响应。生命周期含初始化、服务和销毁。创建Servlet示例代码展示了`doGet()`方法的覆盖。JSP则侧重视图,动态HTML生成,通过JSP脚本元素、声明和表达式嵌入Java代码。Servlet常作为控制器,JSP处理视图,遵循MVC模式。优化策略涉及缓存、分页和安全措施。这些技术是Java服务器端开发的基础。
61 9
|
5月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
【6月更文挑战第23天】Java Web开发中,Servlet和JSP是构建动态Web应用的基础。Servlet处理逻辑,JSP专注展示。示例展示了Servlet如何通过`request.setAttribute`传递数据给JSP渲染。JSP自定义标签提升页面功能,如创建`WelcomeTag`显示欢迎消息。Servlet过滤器,如`CacheControlFilter`,用于预处理数据或调整响应头。这些集成和扩展技术增强了应用效率、安全性和可维护性,是Java服务器端开发的关键。
67 7
|
5月前
|
前端开发 安全 Java
Java服务器端开发实战:利用Servlet和JSP构建动态网站
【6月更文挑战第23天】**Servlet和JSP在Java Web开发中扮演关键角色。Servlet处理业务逻辑,管理会话,JSP则结合HTML生成动态页面。两者协同工作,形成动态网站的核心。通过Servlet的doGet()方法响应请求,JSP利用嵌入式Java代码创建动态内容。实战中,Servlet处理数据后转发给JSP展示,共同构建高效、稳定的网站。虽然新技术涌现,Servlet与JSP仍为Java Web开发的基石,提供灵活且成熟的解决方案。**
74 8