SpringMVC (3)

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文件中的拦截器的顺序决定的。多拦截器情况下,各个拦截器的方法的执行顺序:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值