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

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里输出的提示。



下一篇,来看一下自定义注解,和给注解赋值。
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天涯泪小武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值