<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 加载资源文件 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
如果不手动添加资源文件的话,springmvc默认的资源文件位置在WEB-INF下,默认文件名为:servlet名-servlet.xml.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.sms.springmvc.controller"></context:component-scan>
</beans>
@RequestMapping属性包含以下几个:
①value:请求路径和value属性值一致时,该注解标注的方法即为处理请求的方法
②method:用来设置处理请求的方式,客户请求的方式和method属性的值一致时才可以处理请求.
③parmas:用来设置客户端传到服务器端的数据必须符合某些规则.要求请求路径必须带有parmas属性的值才能处理该请求.
@RequestMapping作用的位置:
①放在方法上:
只对该方法有效
②放在类上:
对当前类的所有方法有效
放在类上时一般只使用value属性.加上value属性后访问路径变成:项目名/类上的value值/方法上的value值
@RequestMapping支持Ant方式的访问路径:
*:表示任意一层目录
?:表示任意一个字符
**:表示任意多层目录
REST风格:使用@PathVariable获得占位符的数据,并赋值给形参
①在处理器的方法中加入对应的形参,保证处理器的形参和请求的参数name一致
若一致就可以自动赋值.若不一致使用@RequestParam
@RequestParam的value属性:通过value指定映射关系
如:@RequestParam(value=“name”)String username,可以指定前端传过来的name输入框的值赋值给username这个形参.
@RequestParam的required:取消自动装配的必须性
如:@RequestParam(value=“name”,required=false),若前端没有名为name这个输入框,服务器也不会报错,有则获取,没有则为空值.
@RequestParam的defaultValue:默认值,没有传参时使用该值
②使用pojo对象接收数据:当pojo对象的属性和客户端表单name 的值一致时可以接收数据,且支持级联关系
③使用servlet原生API获取参数:如:HTTPServletRequest,HttpServletRespnse,HttpSession
①使用ModelAndView存值并进行跳转,方法的返回值为ModelAndView类型
②返回void,使用servlet原生APIrequest和response实现存值和跳转.
③返回String,直接return " 资源路径"实现转发操作,return "redirect: 资源路径"实现重定向操作,形参中传入Model对象,使用model对象进行存值,存在request域中
①使用转发的方式:return “资源路径”;后台会创建一个InternalResourceView对象,对该资源路径进行解析,解析后执行getRequestDispatcher().forward(request,response)命令
②使用重定向的方式:return “redirect:资源路径"的方式,后台会创建一个RedirectView对象,对该资源进行解析,解析后执行sendRedirect(”")命令.
配合< mvc:annotation-driven/>标签,把项目中的静态资源文件(如js文件,css文件)交给tomcat中默认的servlet去处理,不经过前端控制器的处理.
一个处理器若加上了@ResponseBody这个注解,那么该处理器里面就不能在实现页面的跳转。就算返回一个字符串,也会将该字符串作为一个数据响应到客户端。返回的任何类型都会转化为json对象。但需要jackson的jar包的支持.因为springMVC底层使用jackson技术进行数据格式的转换.
Json有两种形式:①Json对象:{key:value,key:value,…};②Json数组:[{key:value,key:value…},{key:value,key:value…},…]
步骤一:加入jackson的jar包(三个).
步骤二:在springMVC.xml中开启mvc注解驱动.
步骤三:在需要转化为json数据的处理器上面加上@ResponseBody注解.
步骤四:在需要转换为json数据的对象直接作为返回值返回.
示例:
①控制器向客户端响应一个json数据类型的list集合:
@Controller
public class TestController {
@RequestMapping("testJson")
@ResponseBody
public List<User> testJson(){
ArrayList<User> list = new ArrayList<>();
User user1 = new User(1001, "张三", "男", 12);
User user2 = new User(1002, "李四", "男", 22);
User user3 = new User(1003, "王五", "男", 32);
User user4 = new User(1004, "赵六", "男", 42);
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
//返回的list集合到客户端后就回转化成json格式
return list;
}
}
②客户端执行ajax请求,希望响应回一个json的数组:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.11.3.min.js"></script>
<script type="text/javascript">
//文档加载函数
$(function(){
$("#btn").click(function(){
//执行ajax请求,请求路径为controller中的testJson这个控制器
$.post("testJson",function(data){//data装载返回的list集合
//循环遍历出data里面的json数组
$(data).each(function(i,u){
$("body").append("id="
+u.id+",username="+u.username+",gender="+u.gender+",age="+u.age +"")
})
},"json")
})
})
</script>
</head>
<body>
<!-- 点击按钮触发ajax请求 -->
<input id="btn" type="button" value="测试json"/>
</body>
</html>
在没有使用springMVC的时候,实现上传功能,我们需要用一个File类型来接收,但使用了springMVC后,我们可以使用MultipartFile类型来接收,因此,需要在springMVC中配置一个解析器来将File类型转化为MultipartFile类型
步骤一:导入commons-io和commons-fileload的jar包;
上传功能需要这两个jar包才能被支持
步骤二:在springmvc.xml中配置解析器MultipartResolver,其中id必须为multipartResolver;
该解析器可以将客户端传来的File类型的对象转化为MultipartFile类型,该类型被springMVC封装,包含了许多关于上传的强大的功能.
配置如下:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
步骤三:在客户端编写上传文件的代码,指定文件域中的name 值和控制器形参中Multipart的名一致.:
<form action="up" method="post" enctype="multipart/form-data">
头像:<input type="file" name="uploadFile"/>
描述:<input type="text" name="desc"/>
<input type="submit" value="上传"/>
</form>
@RequestMapping(value="up",method=RequestMethod.POST)
public String up(String desc,MultipartFile uploadFile) throws IOException{
//获取文件要写出的路径
String originalFilename = uploadFile.getOriginalFilename();
//解决图片重名问题
String finalFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
String path = session.getServletContext().getRealPath("photo") + File.separator + finalFileName;
//将上传的图片写到path下
uploadFile.transferTo(new File(path));
return "success";
}
需要实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter这个类.
第一步:创建一个类实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter这个类
第二步:将该类作为拦截器配置在springMVC中
<mvc:interceptors>
<bean id="myInterceptor" class="com.sms.mvc.interceptor"></bean>
</mvc:interceptors>
问题一:springMVC.xml可以被web.xml以servlet 的形式加载.那么spring的配置文件applicationContext.xml被谁加载?什么时候加载?
spring的配置文件需要被配置在web.xml 的context上下文中,以< context-param> 的形式去加载spring的配置文件,如若不以这样的形式,那么web.xml会默认加载WEB-INF下的applicationContext.xml.配置spring后,需要在服务器开启时创建一个spring 的容器,因此需要配置一个loaderContextListener创建spring的容器.
<!-- 配置spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<!-- 配置监听器加载spring容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>