从一个简单案例上手Spring MVC,同时分析Spring MVC面试问题

    很多公司都会用Spring MVC,而且初级程序员在面试时,一定会被问到这方面的问题,所以这里我们来通过一个简单的案例来分析Spring MVC,事实上,我们在培训中就用这个举例,很多零基础的程序员能很快用这个上手。

   本文的文字和案例根据java web轻量级开发面试教程改编。

1 Spring MVC代码的讲解

    步骤一,创建Web项目,编写web.xml,在其中指定使用Spring的MVC,主要的代码如下。    

1	<servlet>
2	<servlet-name>spring</servlet-name>	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
3	<load-on-startup>1</load-on-startup>
4	</servlet>
5	<servlet-mapping>
6		<servlet-name>spring</servlet-name>
7		<url-pattern>/</url-pattern>
8	</servlet-mapping>

    这里定义了一个Servlet和servlet-mapping,它们一般是成对出现的。在第1行到第4行的servlet元素里,还定义了一个名为Spring的Servlet,并在第2行指定了它的处理类是Spring的DispatcherServlet。也就是说,在这个项目里是用到了Spring的MVC处理类,在第3行里通过load-on-startup来指定这个Servlet在Spring容器加载时就会被加载。

    而在第5行到第8行的servlet-mapping里,通过第7行的url-pattern来指定任何请求都将被Spring这个Servlet来处理。

    通常用localhost:8080/项目名/index.jsp(IP地址:端口号/项目名/目录名/JSP文件名)这种方式来运行Web程序,这里的url-pattern是/。也就是说,IP地址:端口号/项目名里的任何URL请求都将被Spring这个Servlet来处理。   

    步骤二,开发承担控制器角色的RestController类。

1	package com.mvc.rest;
2	import javax.servlet.http.HttpServletRequest;
3	import javax.servlet.http.HttpServletResponse;
4	import org.springframework.stereotype.Controller;
5	import org.springframework.ui.ModelMap;
6	import org.springframework.web.bind.annotation.PathVariable;
7	import org.springframework.web.bind.annotation.RequestMapping;
8	import org.springframework.web.bind.annotation.RequestMethod;
9	import org.springframework.web.servlet.ModelAndView;
10	
11	@Controller
12	public class RestController {
13	    public RestController(){   }
14	
15	    @RequestMapping(value = "/login/{userName}", method = RequestMethod.GET)   
16	    public ModelAndView myMethod(HttpServletRequest request, HttpServletResponse response,             @PathVariable("userName") String userName, ModelMap modelMap) throws Exception {  
17	        modelMap.put("loginUser", userName);
18	        return new ModelAndView("/login/hello", modelMap);
19	    }   
20	//通过注解说明该方法用Get的方式来处理/welcome的请求
21	@RequestMapping(value = "/welcome", method = RequestMethod.GET)  
22	        public String registPost() {  
23	         return "/welcome";
24	    }  
25	}

    在第11行,通过@Controller这个注解来说明RestController类承担了控制器的角色。其中在第16行和第21行分别定义了两个处理函数。先来看个比较简单的registPost方法。

    第21行的@RequestMapping这个注解,通过method来说明用Get方法来处理请求,一旦遇到了比如localhost:8080/SpringMVCDemo/welcome的请求时,将用这个registPost方法来处理。另外的myMethod方法就比较复杂了。

1	@RequestMapping(value = "/login/{userName}", method = RequestMethod.GET)
2	public ModelAndView myMethod(HttpServletRequest request, HttpServletResponse response,             @PathVariable("userName") String userName, ModelMap modelMap) throws Exception {  
3	        modelMap.put("loginUser", userName);
4	        return new ModelAndView("/login/hello", modelMap);
5	}

    一旦用户输入localhost:8080/SpringMVCDemo/login/登录名时,该方法将用Get的方式来处理。这里value的写法是"/login/{userName},也就是说,假如输入了localhost:8080/SpringMVCDemo/login/Java,那么对应的userName值是Java。

    在第3行通过modelMap的put方法,将userName放到loginUser这个属性里,modelMap对象一般用来传递数据到其它页面。在第4行,通过ModelAndView对象,携带包含loginUser参数的modelMap对象跳转到/login/hello页面。

    步骤三 编写针对Spring MVC处理的配置文件。这个配置文件名字可以随便起,一般是放在和web.xml相同的目录里,该配置文件的关键代码如下。   

1	<!-- 自动扫描bean,把作了注解的类转换为bean -->
2	<context:component-scan base-package="com.mvc.rest" />
3	<!—打开Spring MVC的注解功能-->
4	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
5	<!-- 对模型视图名称的解析,在其中为模型视图的名称添加前后缀 -->
6	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
7	<property name = "prefix" value="/"></property>
8	<property name = "suffix" value = ".jsp"></property>
9	</bean>

    其中,第4行的代码可以开启注解模式,这样诸如@Controller之类的注解就能生效了。第6行到第9行的代码给请求加上前缀和后缀。

    步骤四 编写两个jsp文件,请注意hello.jsp是放在Webroot/login目录下。先来看hello.jsp代码。    

1	<html>
2	<head>
3	<meta http-equiv="Content-Type" content="text/html; charset=GBK">
4	<title></title>
5	</head>
6	<body>
7	hello:<%=request.getAttribute("loginUser") %>
8	</body>
9	</html>

    在第7行能显示loginUser的值。welcome.jsp代码就比较简单,就是在第7行固定显示welcome文字。    

1	<html>
2	<head>
3	<meta http-equiv="Content-Type" content="text/html; charset=GBK">
4	<title></title>
5	</head>
6	<body>
7	welcome
8	</body>
9	</html>

    把Spring MVC和Struts部分的代码对比一下,发现Spring里不需要专门的配置文件来定义页面的跳转,而且控制器类的代码也比较随意,从中看不出明显的Spring痕迹。

    下面通过运行来说明它的执行流程。

    方式一,启动Tomcat服务器后,通过http://localhost:8080/SpringMVCDemo/welcome的方式来访问。

①向服务器发送URL请求后,根据web.xml的配置,该请求会由Spring的DispatcherServlet来处理。

②根据@Controller注解,可知RestController类承担着控制器的角色。然后逐一去匹配各方法前的@RequestMapping。

③ /welcome能和registPost方法对上,所以执行其中的return "/welcome";代码,根据配置文件,会在其后加上.jsp的后缀,也就是说,会返回到welcome.jsp页面上。

④展示welcome.jsp页面,显示welcome的文字。

    方式二,通过http://localhost:8080/SpringMVCDemo/login/java的方式来访问。 

    这里同样需要在RestController类里去逐一匹配@RequestMapping,匹配后知道应该由myMethod方法处理。

    根据@RequestMapping的value值,可知userName的值是java,在第4行把java这个值设置到loginUser里,然后跳转到/login/hello这个页面上。

    同样这里需加上后缀.jsp,跳转到/login/hello.jsp页面上,最后将显示hello:java的字样。

    刚才是针对具体项目描述Spring MVC的流程,现在抽象地看一下它的运行流程。

    第一,URL请求首先会被DispatcherServlet处理。

    第二,请求会通过DispatcherServlet来进行转发,然后通过HandlerMapping接口的映射来访问具体的Controller。

    这里提到的HandlerMapping接口是用于处理请求的映射,它有两个实现类。

    对于SimpleUrlHandlerMapping,可以通过编写配置文件,把URL映射到Controller上。

    对于DefaultAnnotationHandlerMapping,可以通过编写注解,把一个URL映射到具体的Controller类上。

    第三,不同的URL请求到达HandlerMapping时,HandlerMapping会根据实际情况访问不同Controller类来进行进行处理。

    第四,Controller处理完成后,可以通过ModelAndView类来封装要返回的数据以及要跳转的目标页面。

2 Spring MVC部分的面试讲解

    Java的优势主要集中在Web层面,如果你通过看JD(职务介绍)发现面试的公司对Spring这块有要求,那么你就得好好准备Spring的Web方面的经验了,而我们面试的职位大多是Web方面的,所以也见过不少用过Spring的程序员。

    假如目前某公司需要一个Java初级程序员(3年左右工作经验),而且需要有Spring方面的经验,以这种需求我们面试过不少人,下面就通过下表来归纳下我们见过的情况。

这里的商业项目经验是说你参与的项目是否是用来挣钱的,所以兼职项目也算商业项目。如果没有毕业后的商业项目经验,那么读书阶段的实习项目也算聊胜于无,我们也录用过工作经验才1年但读书阶段在外面打工2年的候选人。

    从上面的归纳情况来看,大家除了要关注“结合项目说明技术点”外,还得培养对Spring的综合意识,说具体点就是对某个技术的认识,它有哪些优缺点,适用于哪些场景,哪些场景下一定不能用xxx技术。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java社区

spring是什么?它能够做什么?新手必看

20130
来自专栏Gaussic

Spring In Action 4(Spring实战第四版)翻译与理解 第一章 付诸行动

        这几天笔者阅读了一下Spring In Action 4,感觉还是有一定的收获的。在之前的项目上,只会简单地使用Spring MVC,对于很多概...

52720
来自专栏IT可乐

Spring详解(一)------概述

  本系列教程我们将对 Spring 进行详解的介绍,相信你在看完后一定能够有所收获。 1、什么是 Spring ?   Spring是一个开源框架,Sprin...

22370
来自专栏程序你好

Spring Boot 2.0 如约而至,升级与否?

13120
来自专栏程序猿DD

Spring Cloud构建微服务架构:服务注册与发现

在继续编写《Spring Cloud构建微服务架构》系列文章之前,先复刻和重新整理一下之前的内容。除了涵盖原有内容之外,同时做了一些调整,并补充了一些之前缺少的...

34950
来自专栏平凡文摘

Java RESTful 框架的性能比较

20640
来自专栏Java架构

基于Spring Boot和Spring Cloud实现微服务架构学习!

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总...

19920
来自专栏JavaEdge

Spring Boot神器之Spring Date Jpa

一、Spring Date Jpa介绍 什么是JPA? JPA是Java Persistence API的简称,中文名Java持久层API,是JDK5.0注解或...

446120
来自专栏Java后端技术

SpringBoot的幕后推手...

​  这两年随着微服务的盛行,SpringBoot框架水到渠成的得到了高曝光,作为程序猿的我们,现在要是不知道一点SpringBoot相关的东西,貌似出去找工作...

9620
来自专栏SpringBoot 核心技术

第三十一章:SpringBoot配置文件application.properties参数详解

20540

扫码关注云+社区

领取腾讯云代金券