构建Spring WEB应用程序
-
SpringMVC起步
- 跟踪SpringMVC中的请求
-
请求离开浏览器时,会带有请求应该有的所有信息,比如URL和用户提交的表单信息
-
到达Spring的DispatcherServlet。他是单实例的。他的任务就是把请求发送给spring
MVC的控制器(Controler)。他会处理一个或多个HandlerMapping来确定使用哪个控制器。 -
选好控制器之后,DispaycherServlet把数据交给控制器,等待控制器对这些数据进行处理(控制器会进一步交给后面的模块进行工作而本身是不会有太大的负荷的)
-
控制器完成处理以后,通常会留下一些数据,这些数据需要返回给用户并且在浏览器上显示。这些数据被称为“模型”(Model)。这些信息需要以一个友好的方式返回给用户,一般是HTML。所以信息需要发送给一个视图(VIew),通常是JSP
-
控制器做的最后一件事就是给模型打包,并且标出用于渲染输出的视图名。然后就会被送回DispatcherServlet

- 搭建SpringMVC
- 配置DispatchServlet
Servlet的配置会放在web.xml文件里面,这个文件会放在相应的war包里面。但是使用Spring3的规范后,我们可以用另外一种方法:借助java把DispatchServlet配置在Servlet容器里
在Servlet3.0容器里,容器会查找一个叫ServletContainerInitializer的接口的实现类,用来配置Servlet的实现类。Spring就提供了这个实现类
这个实现类提供三个重载的方法
getServletMapping(),他会帮一个或多个路径映射到DispatchServlet上去。现在他会映射“/”,这表示他是默认的Servlet,他会处理应用的所有请求
当DisPatchServlet启动的时候,他会创建Spring的应用上下文,并且加载配置文件或配置文件类的所有bean。实际上,AbstractAnnotation
ConfigDispatcherServletInitializer会创建同时创建DispatcherServlet和ContextLoaderListener,而后者也会创建一个应用上下文。我们希望前者创建的上下文用来创建控制器,视图解析器和处理器映射,后置的上下文用来创建其他的bean。getServletConfigClasses会返回带配置注解的类来配置ContextLoaderListener创建的上下文中的bean。

- 创建最小的mvc配置

视图解析器会根据特定的路径和后缀名查找视图文件。
调用DefaultServletHandlerConfiger的enable方法是要求DispatcherServlet将静态资源的请求转发到默认的Servlet上而不是DispatcherServlet
- 最小的rootConfig配置

- 编写最基本的控制器
在SpringMvc中,控制器是使用@Controller注解标示的类

当收到了对“/”的GET请求时,就会调用home方法,返回的字符串会被解析器解读为需要渲染的视图的名字(这里只是做了一个单纯的字符拼接,把视图解析器的前缀和后缀拼在了一起,在进行访问)
- 测试控制器

- 定义类级别的请求处理器
用于拆分RequsetMapping并且把路径映射到类的级别上。修改后的HomeController如下

当这个RequestMapping被定义在类上面的时候,这个注解会应用到所有的处理器方法上,方法上的RequestMapping会对类的RequestMapping做一个补充。
当然,这个RequestMapping可以有多个映射,如下

- 传递模型到视图中
核心操作就是在@RequestMapping的方法中传入一个Model或者Map,包装好这个Model或者Map在返回视图名。Model对象可以不规定key的名字,使用类名作为key。这里返回的对象是个List<Spittle>,所以他会被命名为splittleList。
以下的代码是一个列表的控制器

对应的仓库接口及其实现类如下


在jsp中使用jstl标签就可以实现获取列表。如果只是简单的字符串,使用EL表达式就可以获取并显示了

显示效果如下

- 接受请求的输入
SpringMVC允许多种方式将客户端的数据发回给服务端,包括
·查询参数
·表单参数
·路径变量
- 查询参数
Get方法的查询参数就是在网址栏?后面的参数,比如
http://localhost:8080/spittles?maxId=13&count=1
把SpittleController里的方法换成下面这个

这样就可以做到传递get方法的参数给控制器
或者使用下面的中规中矩的方法,相当于在方法的传入参数里面加入用@RequestParam标注的参数就可以传入get参数

- 参数路径
参数路径就是使用斜杠来定位传来的参数,比如
http://localhost:8080/spittle/splittle_id/10
Spring允许我们使用占位符,用{}括起来。在不同层次使用RequestMapping标记会使访问的参数重叠。使用@PathVariable标记来声明一个由路径拿到的变量。在Controller里添加一个带有@RequestMapping的方法

注意要创建一个spittlle.jsp的视图
- 处理表单
在处理少量的参数的时候,上面的方法还是很合适的。但是当客户端要传入大量的数据的时候,这些方法就会有些受限了。这时使用表单就是很好的选择
现在新建一个叫Spittler的数据类和SpittlerRepository的接口,接口里定义保存用户的save方法和根据id获得用户对象的方法。
创建用于创建和查询用户的控制器RegisterController

创建一个映射进入有表单的界面

表单界面的jsp如下,因为form的action没有定义,所以在提交表单的时候后提交给自己所在的url

为了接住对自己的post请求,所以再建立一个post的映射。这个时候前台会把名字对应的变量注入给需要返回的类(根据form的inport的name属性和类的属性名字做对比)
返回视图名有个前缀“redirect:”,表示请求重定向。还有一个前缀叫“forward:”,它会前往指定的url路径而不是请求重定向(请求转发)。带有这些前缀的话后面的转发就应该是一个uri而不是视图名

为了显示注册的信息,我们需要拿到刚刚的那个路径参数,这样就可以开始在前端拿到这个参数

网友评论