天天看点

JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串

目录

1.传参方式:

2.中文乱码问题:

3.访问路径:

4.定义拦截器

5.传值方式:

6.文件上下传:

7.文件下载

8.将返回的对象解析成JSON字符串

1.传参方式:

SpringMVC的传参方式:

四种形式

@Controller
public class ParaControlloer {
	@RequestMapping("/param1")
    //使用serlvet原生api来实现
	public ModelAndView method(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		String userName =request.getParameter("userName");
		String password =request.getParameter("password");
		User u=new User(userName,password);
		System.out.println(u);
		return null;
	}
    //前台需要传入的参数名和方法定义的形参名字一致(基于同名匹配规则)
	@RequestMapping("/param2")
	public ModelAndView method2(String userName,
			String password) throws Exception {
		User u=new User(userName,password);
		System.out.println(u);
		return null;
	}
    //当前台名称和后台形参名字不一致的情况,需要使用@RequestParam(“前台参数名”)来注入
	@RequestMapping("/param3")
	public ModelAndView method3(@RequestParam("userName1")String userName,
			String password) throws Exception {
		User u=new User(userName,password);
		System.out.println(u);
		return null;
	}
    //使用模型传参.(前台参数名字需要和模型中的字段名一致.)
	@RequestMapping("/param4")
	public ModelAndView method4(User u) throws Exception {
		System.out.println(u);
		return null;
	}
	@RequestMapping("/delete/{delID}")
	public ModelAndView method5(@PathVariable("delID")Long id) throws Exception {
		System.out.println("删除ID"+id);
		return null;
	}
}
           

注意:

单页面多表单提交时非常容易出错 ,总是会将一份空的提交上去

2.中文乱码问题:

当使用SpringMVC的时候,不像原生的Serlvet可以直接设置字符编码;

需要对web.xml进行如下配置

<filter>
		<filter-name>CharacterEncoding</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>CharacterEncoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
           

3.访问路径:

@RequestMapping如果作用在类上,表示请求都带上这样的地址;

前台访问地址:localhost/test/method

JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串

4.定义拦截器

1.定义拦截器类.需要实现接口:

org.springframework.web.servlet.HandlerInterceptor

2.编写对应的逻辑:

public class MyInterceptor implements HandlerInterceptor{
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("MyInterceptor.preHandle()");
		return true;
	}
	
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("MyInterceptor.afterCompletion()");
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("MyInterceptor.postHandle()");
	}
}
           

true:不拦截

false:拦截

3,将拦截器配置到主配置文件中.

JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串

其中:mvc:mapping path="/**"可以拦截“两级目录”,注意此时会将css、JS等文件统一拦下。

5.传值方式:

1.通过serlvet原生api方式回显数据:

@RequestMapping("/value")
	public ModelAndView value(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		request.setAttribute("msg", "终于没下雨了");
		request.getRequestDispatcher("/hello.jsp").forward(request, response);
		return null;
	}
           

2.使用springMVC所提供的ModelAndView对象回显内容:

@RequestMapping("/value2")
	public ModelAndView value2(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		ModelAndView mv=new ModelAndView();
		mv.addObject("msg", "说什么呢");
		Map<String, Object> map=new HashMap<String, Object>();
		map.put("name","小强");
		mv.addObject(map);
		mv.addObject("HelloWordld");
		mv.addObject(new User("admin","123"));
		mv.setViewName("/value2.jsp");
		return mv;
	}
           

3.直接返回模型: (与TP5非常相似)

    如果参数中没有response对象且返回值又没有返回ModelAndView对象,

这时候springMVC是不知道     处理的视图是哪个的?

此时就需要配置视图解析器来告诉springMVC返回的视图是怎样的. 没有配置视图解析器之前

当请求/value3地址,去到方法后,没有ModelAndView对象,不知道如何去找视图,会自动给你默认的视图/value3,相当于循环调用.

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       		<property name="prefix" value="/WEB-INF/" />
       		<property name="suffix" value=".jsp" />
</bean>
           

Notes:

这里的prefix如果是eclipse的动态项目则这样配 ,如果是myeclipse则需要将“文件丢进去”

@RequestMapping("/value3")
	public User value3(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		return new User("root","123");
	}
           

配置视图解析器后:

当请求/value3地址,去到方法后,没有ModelAndView对象,不知道如何去找视图,会自动给你默认的视图/value3,最后会使用视图解析器帮我们返回的地址添加前缀信息和后缀信息,/WEB-INF/value3.jsp.

返回视图名:前缀+返回值+后缀

JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串
JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串

如果配置了视图解析器,默认返回结果都会带上前缀和后缀信息

如果不需要加上前缀和后缀' 可以返回字符串前加上这样的信息. 

JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串

两种方式:重定向、请求转发

6.文件上下传:

1.需要配置文件上传解析器.

JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串
<!-- 配置文件上传解析器 -->
       <bean id="multipartResolver" 
       			class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
       		<!-- 设置上传文件的最大尺寸为1MB -->
       		<property name="maxUploadSize">
       			<value>#{1024*1024}</value>
       		</property>
       </bean>
           

2.倒入文件上传的Jar包:

JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串
JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串

3.编写核心类.

@RequestMapping("/upload")
	public void upload(MultipartFile file){
		System.out.println(file.getContentType());
		System.out.println(file.getName());
		System.out.println(file.getOriginalFilename());
		System.out.println(file.getSize());
		InputStream is=null;
		FileOutputStream os=null;
		try {
			is=file.getInputStream();
			os=new FileOutputStream(new File("D:/today1.png"));
			IOUtils.copy(is, os);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if (os!=null) {
					os.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if (is!=null) {
					is.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
           

注意此处使用的是:

MultipartFile  而不是FIle类

7.文件下载

与前面的Serlvet基本一致:

JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串

8.将返回的对象解析成JSON字符串

这个比Strus2处理方便实在太多:

1.加入Jackson的包:

JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串

2.在返回方法的时候加上@ResponseBody

(表示我们的请求不再交给springmvc处理,会结合JSON包,将对象解析成JSON字符串)

JSP-SpringMVC(一)传参、传值、拦截器、文件上传1.传参方式:  2.中文乱码问题:3.访问路径:4.定义拦截器5.传值方式:6.文件上下传:  7.文件下载8.将返回的对象解析成JSON字符串

原理:

1.判断方法上是否有@ResponseBody标签

2.是否有Jackson的包.

如果条件都满足 会使用:

com.fasterxml.jackson.databind.ObjectMapper

将返回的对象解析成JSON字符串:

String value = {"userName":"admin","password":"123"}

通过response.writer(value)

继续阅读