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

来源:互联网 发布:软件项目考核指标 编辑:程序博客网 时间:2024/04/30 20:49

第一步:导入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>

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>

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

在spring.xml文件中配置:

    <!-- 配置处理器适配器 -->    <bean        class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

通过查看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;    }}

说明: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>

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

在classpath下的springmvc.xml中配置处理器映射器。

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

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"/>

第八步:视图解析器

因为第五步中编写的视图是采用jsp编写的,因此这里应该配置能够解析jsp的视图解析器。

<!-- 配置视图解析器 -->    <bean        class="org.springframework.web.servlet.view.InternalResourceViewResolver" />

查看InternalResourceViewResolver的源码:

这里写图片描述

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

第九步:部署调试

访问地址:http://localhost:8080/SpringMVCFirst/queryItems.action
页面结果:
这里写图片描述

0 0