关闭

1 手写实现SpringMVC,第一节:项目基本结构

标签: SpringMVC解析自己实现SpringMVC如何实现SpringMVC
1853人阅读 评论(0) 收藏 举报
分类:

SpringMVC是当今最流行的web框架之一,下面就以如何手工实现一个类似SpringMVC的框架,来看一下SpringMVC是如何工作的。

最终目标是达到如下类似于SpringMVC的项目呈现

@Controller
@RequestMapping("/web")
public class MyAction {
    @Autowired
    QueryService queryService;
    @Autowired
    ModifyService modifyService;

    @RequestMapping("/search")
    public void search(@RequestParam("name") String name, HttpServletRequest request, HttpServletResponse response) {
        String result = queryService.search(name);
        out(response, result);
    }

    @RequestMapping("/add")
    public void add(@RequestParam("name") String name,
                    @RequestParam("addr") String addr,
                    HttpServletRequest request, HttpServletResponse response) {
        String result = modifyService.add(name, addr);
        out(response, result);
    }

    @RequestMapping("/remove")
    public void remove(@RequestParam("name") Integer id,
                    HttpServletRequest request, HttpServletResponse response) {
        String result = modifyService.remove(id);
        out(response, result);
    }

    private void out(HttpServletResponse response, String str) {
        try {
            response.getWriter().write(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
这里面的所有注解均为自己实现,项目不依赖任何框架,就是一个单纯的Sevlet项目。

本文基于在网上看的咕泡学院的教学视频来实现。至于SpringMVC的本身的源码解析可参考之前转载的一篇文章。

项目知识点介绍

通过对上面一个最基础的类SpringMVC的项目结构,大概分析如下知识点。
1 自定义注解(@Controller,@RequestParam,@AutoWired等)的使用
2 反射(使用IOC给AutoWired赋值)
3 请求分发、解析
4 其他

搭建项目基本结构

所有的注解、赋值、分发等均为自己实现,不依赖任何框架。

创建一个空的项目

新建一个java web项目,在idea里就是新建Java Enterprise---Web Application,eclipse里就是Dymatic web project。


一个空的项目如上图。

添加一个入口Servlet

package com.tianyalei.mvc;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by wuwf on 17/6/28.
 * 入口Sevlet
 */
public class DispatcherServlet extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("我是初始化方法");
    }

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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        out(resp, "请求到我啦");
    }

    private void out(HttpServletResponse response, String str) {
        try {
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().print(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
这是一个普通的Servlet,里面包含初始化和get、post方法,方便起见,我们让get也走post方法,并在post里输出一句话。

配置web.xml

如果想让Servlet生效,能处理web请求,需要在web.xml做配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>dispatchServlet</servlet-name>
        <servlet-class>com.tianyalei.mvc.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatchServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>
我们配置该Servlet拦截/*也就是所有的请求,那么发起的所有web请求,都将进入DispatcherServlet,之后我们通过分析请求的url,来决定由哪个Controller来处理请求。
这也是Struts2和SpringMVC不同的一个地方,Struts2是通过filter来拦截所有请求,SpringMVC是通过Servlet。

上面就已经完成了一个Servlet的配置,就可以响应web请求了。这也是大部分学JavaWeb开发的第一课。
部署到Tomcat,启动,访问任何一个url,可以看到post里输出的提示。



下一篇,来看一下自定义注解,和给注解赋值。
0
0
查看评论

spring mvc标准项目结构

inews   src    com.xxx.inews.dao    com.xxx.inews.dao.impl    com.xxx.inews.data.entity    com.xxx.i...
  • hjxgood
  • hjxgood
  • 2015-04-24 11:37
  • 11061

SpringMVC+Spring+mybatis+Redis项目从零开始--分布式项目结构搭建

Springmvcspring mybatis maven mysql redis项目从零开始 一. SSM项目-目录框架搭建实现 1. 序言 做SSM项目有一段时间,从来没有系统性的对整个项目结构做一次总结,临近年关,趁着有时间,想把整个SSM项目框架的相关内容梳理一下,同时也弥...
  • a123demi
  • a123demi
  • 2017-01-18 16:33
  • 8776

SpringMVC最基础配置

SpringMVC和Struts2一样,是前后台的一个粘合剂,struts2用得比较熟悉了,现在来配置一下SpringMVC,看看其最基础配置和基本使用。SpriingMVC不是太难,学习成本不高,现在很多人都喜欢使用它了。 本次demo工程是一个maven工程,使用maven来对项目进行管理。 一...
  • clj198606061111
  • clj198606061111
  • 2014-03-04 23:23
  • 55435

使用IDEA创建Spring mvc工程及简要分析

需要使用IDEA ultimate版本,才会有Web支持。0.创建工程       File->New->Project…        一路向下,最后创建一个tomcat server,mac上下载解压即...
  • pur_e
  • pur_e
  • 2016-04-25 16:21
  • 12249

springmvc系列(一)-新建springmvc项目

新建一个maven项目pom.xml中加入依赖 javax.servlet servlet-api 2.5 provided ...
  • u010372981
  • u010372981
  • 2017-06-25 23:15
  • 255

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

使用SSM(Spring、SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方。之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目重新搭建了一次,而且比项目搭建的要更好一些。以前解决问题的过程...
  • gebitan505
  • gebitan505
  • 2015-03-19 11:44
  • 1233937

用Eclipse建spring mvc项目(图解)

最近工作需要快速了解spring mvc架构,于是在网上找了很多相关教程。说真的,百度出来的基本都一样,但是我却遇到各种奇奇怪怪的问题。当然,做完之后回头看,发现那些问题都不是问题,哈哈哈哈~主要还是不懂java这些东西,遇到问题的时候就会觉得很难,各种查,但是百度的结果又是让人很无奈,不同的网址,...
  • fulai0_0
  • fulai0_0
  • 2015-01-21 13:54
  • 57363

SpringMVC简单项目配置

一、刚刚工作,公司用的是SpringMVC框架,大学时候对框架了解很少的我只有到处找资料,但是发现几乎都没有一个能完全看明白的,花了两周对SpringMVC也有了一定理解,现在以初学者的身份做个总结,算是对后来的初接触者的一点启发吧,希望我走的弯路你们不用再走了,写错的地方还请指出来。谢谢! 二、首...
  • show_me_the_world
  • show_me_the_world
  • 2015-07-25 13:39
  • 12169

zhjy工作记录之三--SpringMVC+ligerui项目结构

来zhjy两周了,下面是项目中用到的一些架构和项目中的目录结构。         功能模块后台代码按功能名称分别存放在 com.zhjy包下,例如:公告管理模块,如下图         绿色线框就是 公告...
  • xiaokui008
  • xiaokui008
  • 2012-09-24 20:06
  • 6918

基于Spring + Spring MVC + Mybatis 高性能web构建

一直想写这篇文章,前段时间 痴迷于JavaScript、NodeJs、AngularJs,做了大量的研究,对前后端交互有了更深层次的认识。 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详细的配置,详细的注释,看起来应该很容易懂。 用最合适的技术去实现,并不断追求最佳实践。这就是架构之道...
  • zoutongyuan
  • zoutongyuan
  • 2014-11-22 12:28
  • 189277
    个人资料
    • 访问:350044次
    • 积分:4389
    • 等级:
    • 排名:第8156名
    • 原创:100篇
    • 转载:39篇
    • 译文:0篇
    • 评论:148条
    博客专栏
    友情链接
    最新评论