1.Springmvc的标准配置
第一步:导入jar包
第二步:在web.xml文件中配置springmvc的前端控制器、CharacterEncodingFilter、HiddenHttpMethodFilter
<!-- springmvc的前端控制器 -->
<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>
<!-- 配置处理post请求乱码的过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置将POST转换为PUT或者Delete请求的过滤器 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
第三步:创建springmvc.xml并配置
配置内部资源视图解析器、扫描包、mvc:default-servlet-handler、mvc:annotation-driven
<!-- 配置扫描包 -->
<context:component-scan base-package="com.offcn"/>
<!-- 配置内部资源视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置处理静态资源文件的标签 -->
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
第四步:编写controller层代码
@RequestMapping("/info")
public String getUserInfo() {
System.out.println("请求来过了.......");
return "success";
}
2.响应数据
2.1异步响应
如何从controller层返回json数据
1.导入json的jar包[3个]
2.在目标handler方法上标记一个@ReponseBody注解
3.在springmvc的配置文件中配置mvc:annotation-driven
注意点:
1.如果controller层返回的是json数据,返回值类型可以是各种数据
类型【不包含ModelAndView】
2.Map---------->json对象
POJO–=------>json对象{}
List—>json数组[]
3.map必须是自己创建的
2.2前后端异步交互
前端代码
$(function(){
$.ajax({
type: "GET",
url: "${pageContext.request.contextPath}/user/list",
success: function(msg){
//遍历数组,index表示数组中元素的索引值,item表示数组中的元素
$(msg).each(function(index,item){
var tr ="<tr>"
+"<td>"+item.uid+"</td>"
+"<td>"+item.username+"</td>"
+"<td>"+item.age+"</td>"
+"<td>"+(item.gender?'男':'女')+"</td>"
+"<td>"+item.email+"</td>"
+"<td>"+item.salary+"</td>"
+"</tr>";
//将拼接成的tr添加到列表中
$("#list-table").append(tr);
});//循环结束
}
});
});
后端接口:
@RequestMapping("/list")
@ResponseBody
public List<User> listUsers() {
List<User> list = new ArrayList<>();
list.add(new User(1, "张立鹏", 20, true, "zhanglipeng@163.com", 10000));
list.add(new User(2, "刘晓轩", 21, true, "lxx@163.com", 10000));
list.add(new User(3, "刘博", 22, true, "ll@163.com", 10000));
list.add(new User(4, "卢家亮", 23, true, "ljl@163.com", 10000));
return list;
}
3.类型转换器
Springmvc自带了一些简单的类型转换器:
Integer-boolean
String-Integer
3.1全局类型转换器
全局类型转换器:指的是在springmvc的配置文件中配置一次,在所有controller层的所有方法都可以使用。
- 第一步:自定义一个类实现converter接口,需要指定源数据类型和目标数据类型
- 第二步:在springmvc的配置文件中配置FormattingConversionServiceFactoryBean对象
- 第三步:mvc:annotation-driven标签配置一个conversion-service属性
自定义转换器
public class DateTimeFormatConverter implements Converter<String,Date> {
@Override
public Date convert(String arg0) {
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
Date result = null;
try {
result = sdf.parse(arg0);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}
Springmvc的配置文件:
<!-- 配置转换器工厂bean -->
<bean id="dsdd" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters" >
<set>
<bean class="com.offcn.p1.converter.DateTimeFormatConverter"></bean>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="dsdd"/>
3.2局部类型转换器
局部类型转换器:在某个controller层的某个方法上配置一次就能使用。
@DateTimeFormat:时间格式化,pattern属性指定将哪种格式的字符串转换为时间类型
@NumberFormat:数字格式化, pattern属性指定将哪种格式的字符串转换为数字类型
4.文件操作
4.1文件上传
前端页面:
第一:必须发送POST请求
第二:form表单的encytype=”multipart/form-data”
第三:表单项的type=”file”
后端要求:
第一:导入commons-fileupload、commons-io
第二:必须在springmvc的配置文件中配置多媒体解析器:CommonsMultiPartResolver
第三: 在handler方法使用MultiPartFile类型的参数来接收文件
注意:多媒体解析器的id值必须为:multipartResolver
页面:
<form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="username"><br>
文件:<input type="file" name="photo"><br>
<input type="submit" value="提交">
</form>
Springmvc的配置文件:
<!-- 配置多媒体解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置编码格式 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 设置上传文件的最大值 -->
<property name="maxUploadSize" value="#{500*1024*1024}"></property>
</bean>
Controller层方法
@RequestMapping(value="/upload",method=RequestMethod.POST)
public ModelAndView upload(MultipartFile photo,HttpServletRequest request,String username) throws IOException {
System.out.println(username);
String realPath = request.getServletContext().getRealPath("/upload");
File directory = new File(realPath);
if(!directory.exists()) {
directory.mkdirs();
}
String fileName = UUID.randomUUID().toString().replaceAll("-", "")+photo.getOriginalFilename();
//保存文件到本地服务器
photo.transferTo(new File(realPath+"\\"+fileName));
/*FileOutputStream fileOutputStream = new FileOutputStream(new File(realPath+"\\"+fileName));
InputStream inputStream = photo.getInputStream();
IOUtils.copy(inputStream, fileOutputStream);*/
ModelAndView mv = new ModelAndView("success");
mv.addObject("name", fileName);
return mv;
}
4.2文件下载
//文件下载
@RequestMapping("/download")
public ResponseEntity<byte[]> downloadFile(HttpSession session) throws Exception{
String fileName="风吹麦浪.mp3";
String realPath = session.getServletContext().getRealPath("/WEB-INF/"+fileName);
FileInputStream fis = new FileInputStream(new File(realPath));
byte[] body =new byte[fis.available()];
fis.read(body);
MultiValueMap<String,String> headers= new HttpHeaders();
fileName = new String(fileName.getBytes("gbk"),"iso8859-1");
headers.add("Content-Disposition", "attachment;filename="+fileName);
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> result = new ResponseEntity<byte[]>(body, headers, statusCode);
if(fis != null) {
fis.close();
}
return result;
}
5.拦截器【Interceptor】
拦截器类似于JavaWeb部分学过Filter过滤器,在请求到达目标方法之前,对请求拦截,可以进行身份验证、日志等。
5.1自定义拦截器
1.自定义一个类实现HandlerInterceptor接口,实现接口的三个方法
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obect) throws Exception {
System.out.println("FirstInterceptor preHandle....");
return true;
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView mv)
throws Exception {
System.out.println("FirstInterceptor postHandle...");
}
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("FirstInterceptor afterCompletion...");
}
}
2.在springmvc的配置文件中配置mvc:interceptors标签
<mvc:interceptors>
<bean class="com.offcn.p1.interceptor.FirstInterceptor"></bean>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/static/**"/>
<bean class="com.offcn.p1.interceptor.FirstInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
5.2多拦截器的执行顺序
多拦截器情况下,拦截器的执行顺序是由配置在springmvc.xml文件中的拦截器的顺序决定的。多拦截器情况下,各个拦截器的方法的执行顺序: