目录
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
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,将拦截器配置到主配置文件中.
其中: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.
返回视图名:前缀+返回值+后缀
如果配置了视图解析器,默认返回结果都会带上前缀和后缀信息
如果不需要加上前缀和后缀' 可以返回字符串前加上这样的信息.
两种方式:重定向、请求转发
6.文件上下传:
1.需要配置文件上传解析器.
<!-- 配置文件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为1MB -->
<property name="maxUploadSize">
<value>#{1024*1024}</value>
</property>
</bean>
2.倒入文件上传的Jar包:
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基本一致:
这个比Strus2处理方便实在太多:
1.加入Jackson的包:
2.在返回方法的时候加上@ResponseBody
(表示我们的请求不再交给springmvc处理,会结合JSON包,将对象解析成JSON字符串)
原理:
1.判断方法上是否有@ResponseBody标签
2.是否有Jackson的包.
如果条件都满足 会使用:
com.fasterxml.jackson.databind.ObjectMapper
将返回的对象解析成JSON字符串:
String value = {"userName":"admin","password":"123"}
通过response.writer(value)