您的位置:首页 > 编程语言 > Java开发

入门Demo---SpringMVC学习笔记(二)

2017-08-22 09:59 513 查看


第一步:导入spring3.2.0的jar包




第二步:配置前端控制器

在WEB-INF\web.xml中配置前端控制器
<!-- springMVC前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springmvc加载的配置文件
如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml,在这里也就是springmvc-servlet.xml
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
url-pattren有很多中配置方式:
第一种:*.action,表示访问以.action结尾由DispatcherServlet进行解析
第二种:/,表示所有访问的地址都由springmvc的DispatcherServlet进行解析
第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet进行解析jsp,但是并不能根据这个jsp找到对应的handler,所以会报错
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23


url-pattern中配置的Servlet的拦截方式:

1、拦截固定后缀的url,比如设置为 .do、.action, 例如:/user/add.action 

此方法最简单,不会导致静态资源(jpg,js,css)被拦截。

2、拦截所有,设置为/,例如:/user/add /user/add.action 

此方法可以实现REST风格的url,很多互联网类型的应用使用这种方式。 

但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示。需要特殊处理。

3、拦截所有,设置为/*,此设置方法错误,因为请求到Action,当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功。


第三步:配置处理器适配器

在上一步中有看到:
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
1
2
3
4
1
2
3
4

所以就应该在classpath下的springmvc.xml中配置处理器映射器、处理器适配器、视图解析器。

spring.xml文件中配置:
<!-- 配置处理器适配器 -->
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
1
2
3
1
2
3

通过查看SimpleControllerHandlerAdapter的源码:



可以发现此适配器执行实现了Controller接口的handler。因此编写的Handler必须实现Controller接口才能被处理器适配器识别。 




第四步:开发Handler

有第三步得出的结论: 

Handler需要实现controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter适配器执行。
public class ItemsController1 implements Controller{

@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//调用service查找数据库,查询商品列表。这里使用静态数据模拟
List<Items> itemsList = new ArrayList<Items>();
//向list中添加静态数据
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 联想笔记本电脑!");

Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!");

itemsList.add(items_1);
itemsList.add(items_2);

//返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
//相当于request的setAttribute()方法,以后在jsp页面中可以通过itemsList取数据
modelAndView.addObject("itemsList", itemsList);

//指定视图
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");

return modelAndView;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

说明:ModelAndView包含了模型数据及逻辑视图名


第五步:视图的编写

在第四步中指定了视图,因此下面就要编写第四步中指定的视图的页面代码。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询商品列表</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/item/queryItem.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td><input type="submit" value="查询" /></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
<td>商品名称</td>
<td>商品价格</td>
<td>生产日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${itemsList }" var="item">
<tr>
<td>${item.name }</td>
<td>${item.price }</td>
<td><fmt:formatDate value="${item.createtime}"
pattern="yyyy-MM-dd HH:mm:ss" /></td>
<td>${item.detail }</td>

<td><a
href="${pageContext.request.contextPath }/item/editItem.action?id=${item.id}">修改</a></td>

</tr>
</c:forEach>

</table>
</form>
</body>

</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46


第六步:配置处理器映射器

在classpath下的springmvc.xml中配置处理器映射器。
<!-- 配置处理器映射器 -->
<!-- BeanNameUrlHandlerMapping映射器的作用:
根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
1
2
3
4
5
1
2
3
4
5

BeanNameUrlHandlerMapping:表示将定义的Bean名字作为请求的url,需要将编写的controller在spring容器中进行配置,且指定bean的name为请求的url,且必须以.action结尾。 

因此,下一步中必须将之前开发好的Handler配置到spring容器中。


第七步:配置Handler

因为上一步中配置的处理器映射器BeanNameUrlHandlerMapping是根据Bean的name来作为url来请求这个bean对应的class的。所以这里需要配置Handler
<!-- 配置Handler -->
<bean name="/queryItems.action" class="com.huihui.controller.ItemsController1"/>
1
2
1
2


第八步:视图解析器

因为第五步中编写的视图是采用jsp编写的,因此这里应该配置能够解析jsp的视图解析器。
<!-- 配置视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
1
2
3
1
2
3

查看InternalResourceViewResolver的源码:



可以发现解析jsp的这个视图解析器默认采用了jstl标签,因此classpath下必须要有jstl的jar包。


第九步:部署调试

访问地址:http://localhost:8080/SpringMVCFirst/queryItems.action 

页面结果: 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  web.xml spring mybatis java jar