springmvc使用注解进行开发
DispatcherServlet.properties
前端控制器从DispatcherServlet.properties中加载处理映射器、适配器、视图解析器等组件,如果不在springmvc.xml中配置,使用默认加载的。
springmvc注解开发
实际企业开发中使用springmvc注解进行开发
jar包的依赖
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.company</groupId>
<artifactId>springdemo2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!--junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- springmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- servlet的jar包依赖,
<scope>provided</scope>
表示编译时有效,不会打包发布到Tomcat中
-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- jsp的jar包依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- jstl表达式 -->
<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<!-- 添加tomcat插件 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<hostName>localhost</hostName>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置DispatcherServlet
在web.xml中配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>springdemo2</display-name>
<!--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:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 第一种:*.do,访问以.do结尾由DispatcherServlet进行解析;
第二种:/,所有访问的地址都由于DispatcherServlet进行解析,对于静态文件的解析需要配置,
不让 DispatcherServlet进行解析,此种方式可以实现RestFul风格的Url -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
配置注解映射器和适配器
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。
<!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置
mvc:annotation-driven默认加载很多的参数绑定方法,
比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
实际开发时使用mvc:annotation-driven
-->
<!-- <mvc:annotation-driven></mvc:annotation-driven> -->
Handler处理器
- 在springmvc的配置文件spring-mvc.xml中配置组件扫描
<!-- 组件扫描,指定 Controller所在的包-->
<context:component-scan base-package="cn.itcast.ssm.controller"/>
- 开发Handler也就是Controller
package cn.itcast.ssm.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import cn.itcast.ssm.po.Items;
/**
*
* @author 86182
*
*/
@Controller
public class ItemController{
/*
* @Controller指定这是一个Handler(处理器)
*@RequestMapping: 标记请求 URL
*/
@RequestMapping("/hello")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 调用service查找 数据库,查询商品列表,这里使用静态数据模拟
List<Items> items = 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苹果手机!");
items.add(items_1);
items.add(items_2);
/*
* ModelAndView有两个常用的构造器
* ModelAndView(String viewName)
* ModelAndView(String viewName,Map data)
* 注:
* viewName:视图名
* data: 数据
*/
//返回ModelAndView
ModelAndView modelAndView=new ModelAndView();
//相当于request的setAttribute,在jsp页面中通过items获取数据
modelAndView.addObject("items",items);
//指定视图
modelAndView.setViewName("items/itemsList");
return modelAndView;
}
}
ViewResolver(视图解析器)
在springmvc的配置文件中添加如下代码:
<!--视图解析器 ,解析jsp,默认使用jstl标签,classpath下得有jstl的jar包-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--jsp路径的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!--jsp路径的后缀 -->
<property name="suffix" value=".jsp" />
</bean>
itemsList.jsp页面
<%@ page 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>
<html>
<head>
<meta charset="UTF-8">
<title>查询商品列表</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/item/queryItem.do"
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="${items }" var="items">
<tr>
<td>${items.name }</td>
<td>${items.price }</td>
<td>
<!-- fmt:formatDate:jstl表达式格式化日期 --> <fmt:formatDate
value="${items.createtime }" pattern="yyyy-MM-dd HH:mm:ss" />
</td>
<td>${items.detail }</td>
<td><a
href="${pageContext.request.contextPath }/item/editItem.do?id=${items.id}">修改</a>
</td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
部署运行
点击项目->右键鼠标,选择Run as ,选择Maven build,弹出如下窗口,在Goals输入框中输入tomcat7:run,然后点击Apply,再点击Run
访问页面出现404,是由于在配置springmvc前端控制器访问时,DispatcherServlet拦截了所有的请求
静态资源无法直接访问,所以需要在springmvc的配置文件spring-mvc.xml中配置静态资源的访问
静态资源的访问
<!--mapping:映射的位置,求地址是 /static/html 这样的格式,
对应的资源就去/static/html/ 这个目录下查找,
location:在映射路径中**表示匹配多层路径,*表示匹配多层路径
下面的配置,表示映射所有的请求路径时,对应的静态资源都放在根目录下面
-->
<mvc:resources location="/" mapping="/**"/>