从一个简单案例上手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年半(工作经验可以包括毕业前的实习经验),或者简历上没写Spring方面的经验,或者没有类似Web方面的经验 |
如果简历上没有其他出彩的地方(比如名校,有海外工作经验或者有其他我们各项目关注的条件等)无法通过简历初选的概率是7成 |
|
工作经验2到3年,但最近半年的项目和Spring或者Java Web开发项目无关 |
如果简历上没有数据库优化或,Java性能调优之类的加分项,也有可能通不过初选,即使通过考官的技术面试,也会加上“最近没有相关项目经验”的评语 |
|
工作经验2到3年,最近在做Spring相关项目,如果简历上的项目和考官的项目的技术匹配度很高,工作年限可以降低到1年半左右 |
无法结合项目说出是怎么用Spring技术的,或者通过考官的询问说出以前只在学习上用过,或者Spring项目是培训机构给的 |
如果Spring技术确实可以,而且其他综合能力也不差,考官会让他通过,然后加上“没有Spring商业项目的经验”,如果有其他更好的候选人,考官不会录用没有商业项目的候选人 |
能结合项目告诉考官IoC和AOP的用途,能结合项目叙述Spring MVC的流程,而且技术问题也能大致说上,但无法说出对技术的观点,比如用注解有什么优缺点。 |
至少Spring方面过关了,但考官会加上如下评语:能用Spring做项目,但对相关技术把握程度不深 这种候选人纯粹是仅仅能跟在项目经理后面做项目,一般很少有自己的发挥,离升级到高级程序员还有一定的距离 |
|
不仅能说出一些只有用过才知道的技术或者调试方式,而且能说出自己的观点,比如我仅仅在xxx情况下URL里带参数的方式传值,原因是xxx,或者我们项目综合考虑还是用到注解,原因是xxx对框架有自己的观点。能结合自己的项目说出具体框架的局限性,或者能说出用Spring框架 |
由于考官的要求是初级程序员,所以观点只要别太离谱就行 是否有自己的想法是一个重要的衡量标准。项目经理有时候没法顾及到细节,这时候就需要程序员自己发挥,所以考官遇到这类的候选人,一般是优先考虑的 很少有人能达到这种水准,这种候选人基本上可以升级到高级程序员了 |
|
解决哪些项目里的重大问题,或者架构师在搭建项目架构时,你参与了 |
||
针对某个项目的具体问题,能自己搭建基于Spring的框架 |
没见过,这属于高级程序员的能力范围了,写在这里是给大家一个努力的方向 |
|
这里的商业项目经验是说你参与的项目是否是用来挣钱的,所以兼职项目也算商业项目。如果没有毕业后的商业项目经验,那么读书阶段的实习项目也算聊胜于无,我们也录用过工作经验才1年但读书阶段在外面打工2年的候选人。
从上面的归纳情况来看,大家除了要关注“结合项目说明技术点”外,还得培养对Spring的综合意识,说具体点就是对某个技术的认识,它有哪些优缺点,适用于哪些场景,哪些场景下一定不能用xxx技术。
从一个简单案例上手Spring MVC,同时分析Spring MVC面试问题的更多相关文章
- 一个简单易上手的短信服务Spring Boot Starter
前言 短信服务在用户注册.登录.找回密码等相关操作中,可以让用户使用更加便捷,越来越多的公司都采用短信验证的方式让用户进行操作,从而提高用户的实用性. Spring Boot Starter 由于 S ...
- Arachnid包含一个简单的HTML剖析器能够分析包含HTML内容的输入流
Arachnid是一个基于Java的web spider框架.它包含一个简单的HTML剖析器能够分析包含HTML内容的输入流.通过实现Arachnid的子类就能够开发一个简单的Web spiders并 ...
- Spring核心原理分析之MVC九大组件(1)
本文节选自<Spring 5核心原理> 1 什么是Spring MVC Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 S ...
- 一个简单web系统的接口性能分析及调优过程
在测试一个简单系统接口性能压力时,压到一定数量,程序总是崩溃,查看相关机器相关数据时,CPU.内存.IO占用均不高,问题自然出现在其它地方先介绍下系统部件架构 Resin版本为:[root@local ...
- scrapy框架系列 (2) 一个简单案例
学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的 Spider 并提取出结构化数据(Item) 编写 Item Pipelines 来存储提取到的Item(即结构化 ...
- Spark一个简单案例
Spark是一个类似Map-Reduce的集群计算框架,用于快速进行数据分析. 在这个应用中,我们以统计包含"the"字符的行数为案例,.为建立这个应用,我们使用 Spark 1. ...
- 来来来,告诉你一个简单易上手的KPI打分的方子
▋1/3 前言 每个企业都要定期为员工的工作来进行考核,有月度考核.季度考核和年度考核. 这次月度考核,我打算用一种新的方式来执行. 我在我们研发小组内曾分享过能力-意愿四象限图.根据岗位技术能力和工 ...
- 一个简单的 IDA f5插件问题分析
有人提出问题,以下汇编f5结果缺失代码: .text:00000C18 Java_com_a_b_c .text:00000C18 PUSH {R3,LR} .text:00000C1A CMP R2 ...
- 一个简单C程序的汇编代码分析
几个重要的寄存器 eip - 用于存放当前所执行的指令地址 esp - 栈(顶)指针寄存器 ebp - 基址(栈底)指针寄存器 简单的C程序 int g(int x) { ; } int f(int ...
随机推荐
- 201521123112《Java程序设计》第1周学习总结
1.本周学习总结 本周通过面授课和上机课,以及在课后通过对<Java学习笔记>前一二章的阅读,初步了解了Java在计算机领域中的重要性,以及Java为什么能够这么广泛的运用在编程中.通过上 ...
- 201521044091 java 第一周总结
1.本周学习总结 (1)第一次开始接触java语言,有些用法还是和c和c++有点差异,需要不断去学习 (2)java其实不仅仅一种高级语言,它包括的还有它的整套体系. 2. 书面作业 1.为什么jav ...
- ASCII中关于大小写字母间隔为32的思考
一直没有搞清楚为什么在ASCII中要把大小写字母的间隔设置为32,今天才发现这样设置的精妙之处:方便了程序对大小写字母进行转换.请看: ================= 十进制 32 ...
- 201521123055 《Java程序设计》第12周学习总结
1. 本章学习总结 2. 书面作业 将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文件读出显示. Q ...
- 在控制台显示“Hello World”
//作者:江骆 //功能:在控制台显示"Hello World" //日期:2017.7.19 public class helloworld //public 表示公共类,一 ...
- [js高手之路]Node.js模板引擎教程-jade速学与实战3-mixin
强大的mixin mixin类似于函数的功能,可以达到模块复用的效果 mixin show: 定义一个类似函数的功能,名字叫show,里面的就是他的内容 +show: 调用show,每调用一次执行一次 ...
- 笔记3 linux 多线程 条件变量+互斥锁
//cond lock #include<stdio.h> #include<unistd.h> #include<pthread.h> struct test { ...
- 浅谈JAVA中“增强”类的某个方法的几个中方法!
一.继承 使用场景:能够控制这个类的构造的时候,才可以使用继承. 优点:简单容易使用, 缺点:耦合性大大的增强,不利于后期的维护,所以对于继承这种方法,谨慎使用. 代码实现:二.装饰者模式 使用场景 ...
- JSP页面格式化数字或时间 基于struts的
jsp日期格式化 转自: http://blog.csdn.net/chj225500/article/details/7251552 在直接<s:textfield中也要日期格式化,平时使用日 ...
- 框架应用:Mybatis (一) - 入门案例
ORM框架 在实际开发中,工程中本质的任务是从数据库中获取数据,然后对数据进行操作,又或者写入数据.开发时语言是大多是面向对象的工程语言,这个时候就必须进行工程语言和数据库连接语言的转换,也就是所谓的 ...