内容:
1.值传递
2.编码过滤器
3.类型转换器的配置
4.SpringMVC的转发与重定向
5.处理器经常使用返回类型
6.SpringMVC引入静态资源文件(js,css)等
7.SpringMVC中经常使用注解
8.文件上传
1.值传递
1.含有自定义属性的自定义类型
实体:
public class Person {
private String address;
private User user;
}复制代码
Jsp页面:
<form action="saveUser" method="post">
编号:<input type="text" name="user.uid">
姓名:<input type="text" name="user.uname">
生日:<input type="text" name="birthday">
<input type="submit" value="提交">
生日:<input type="text" name="birthday">
</form>
复制代码
后台:
@RequestMapping("saveUser")//1. 含有自定义属性的自定义类型
public String saveUser(Model m, Person p){
m.addAttribute("msg",p);
return "index";
}
复制代码
附加:
<!-- 定义视图解析器的先后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--因为我配置了这个先后缀,
因此其余代码默认都视为
例如 return "main"至关与 return "main.jsp"-->
复制代码
2.含有自定义属性List集合的自定义类型:
实体:
public class Person {
private String address;
private List users;
}复制代码
Jsp页面:
<form action="saveUserByList" method="post">
编号:<input type="text" name="users[0].uid"/>
姓名:<input type="text" name="users[0].uname"/>
地址:<input type="text" name="address"/>
<hr>
<hr>
编号:<input type="text" name="users[1].uid"/>
姓名:<input type="text" name="users[1].uname"/>
地址:<input type="text" name="address"/>
<input type="submit" value="提交">
</form>
复制代码
后台:
@RequestMapping("saveUserByList")//2. 含有自定义属性List集合的自定义类型
public String saveUserByList(Model m,Person p){
m.addAttribute("msg",p);
return "index";
}
复制代码
3.含有自定义属性Set集合的自定义类型
实体:
public class Person {
private String address;
private Set<User> userSet=new HashSet<>();
}
无参构造:
public Person() {
userSet.add(new User());
userSet.add(new User());
}
复制代码
Jsp页面:
<form action="saveUserBySet" method="post">
编号:<input type="text" name="userSet[0].uid"/><br>
姓名:<input type="text" name="userSet[0].uname"/><br>
<hr>
<hr>
编号:<input type="text" name="userSet[1].uid"/><br>
姓名:<input type="text" name="userSet[1].uname"/><br>
地址:<input type="text" name="address"/><br>
<input type="submit" value="提交">
</form>
复制代码
后台:
@RequestMapping("saveUserBySet")//3. 含有自定义属性Set集合的自定义类型
public String saveUserBySet(Model m,Person p){
m.addAttribute("msg",p);
return "index";
}
复制代码
4.含有自定义属性Map集合的自定义类型:
实体:
public class Person {
private String address;
private User user;
private Map<String,User> userMap;
}
复制代码
Jsp页面:
<form action="saveUserByMap" method="post">
编号:<input type="text" name="userMap['a'].uid"/><br>
姓名:<input type="text" name="userMap['a'].uname"/><br>
<hr>
<hr>
编号:<input type="text" name="userMap['1'].uid"/><br>
姓名:<input type="text" name="userMap['1'].uname"/><br>
地址:<input type="text" name="address"/><br>
<input type="submit" value="提交">
</form>
复制代码
后台:
@RequestMapping("saveUserByMap")//4. 含有自定义属性Map集合的自定义类型
public String saveUserByMap(Model m,Person p){
m.addAttribute("msg",p);
return "index";
}
复制代码
2.编码过滤器
在Web.xml中配置以下:
<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>
复制代码
3.类型转换器的配置
注:参数适配器错误
1.注解方式配置转换器:
直接在属性上加上注解:
public class User {
private String uname;
private String password;
//DateTimeFormat:日期格式化注解,
//在Spring MVC框架中,时间类型的数据没法自动绑定
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
}
复制代码
2.自定义转换器
1.建立转换器类:
public class DateConvertor implements Converter<String, Date> {
@Override
public Date convert(String s) {
//建立时间格式化对象
SimpleDateFormat sif = new SimpleDateFormat("yyyy-MM-dd");
Date date=null;
try {
date = sif.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
复制代码
2.在SpringMVC的配置文件中实例化转换器服务:
<!-- 建立自定义转换器对象-->
<bean id="dac" class="com.springmvc.utils.DateConvertor"/>
<!-- 实例化转换器服务,把自定义转换器对象注入converters中-->
<bean id="myConverter" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters" ref="dac"/>
</bean>复制代码
3.在注解驱动中加载类型转换器服务:
<!-- 开启MVC注解驱动--> <mvc:annotation-driven conversion-service="myConverter"/>
4.SpringMVC中的转发与重定向
1.默认以转发的方式跳转到相应的页面和请求
2.重定向到指定的页面或者请求:
例如:
return "redirect:页面"(后缀不能省略)
return "redirect:请求名"(支持相对路径和绝对路径)
@RequestMapping("res1")
public String demo01(){
return "redirect:main.jsp";
/*重定向到某一个页面时,后缀不能够省略,省略是重定向到某一个请求。*/
}
复制代码
3.重定向传值:
1.redirect:请求名?变量=值&变量=值...
@RequestMapping("res2")
public String demo02(int uid){
return "redirect:res3?uid="+uid;
}
@RequestMapping("res3")
public String demo03(int uid){
System.out.println(uid);
return null;
}
复制代码
2.经过model传值:底层传值方式和上面第一种同样,相似get传值
@RequestMapping("res4")
public String demo04(Model m,int uid){
m.addAttribute("uid",uid);
return "redirect:res3";
}
复制代码
3.Flash传值:
特色:
1.post传值方式,不会将值显示到浏览器上
2.传递的值会自动绑定到重定向的model里
3.能够传递自定义类型的变量
@RequestMapping("res5")
public String demo05(int uid, RedirectAttributes ra){
ra.addFlashAttribute("uid",uid);//传递自定义类型
ra.addFlashAttribute("user",new User(1,"lll"));
return "redirect:res6";
}
复制代码
注:若是须要在重定向的model里获取值,能够将其转换为map集合,具体代码以下:
@RequestMapping("res6")
public String demo06(Model m){
Map<String, Object> map = m.asMap();
for (String s : map.keySet()) {
System.out.println("取值:"+map.get(s));
}
return "main";
}
复制代码
5.处理器经常使用返回类型
1.String
默认将String做为试图名:
@RequestMapping("r1")//将String做为视图名
public String r1(){
return "main";
}
复制代码
在异步请求中,将String字符串直接做为Http响应内容返回:
@RequestMapping("r2")
@ResponseBody
public String r2(){
return "aaa";
}
复制代码
2.返回void类型
1.默认将(前缀+请求名+后缀)做为默认视图:
@RequestMapping("r3")//因为我定义了视图解析器的先后缀,这里跳转到r3.jsp
public void r3(){
}
复制代码
2.也能够不跳转页面直接在当前页面返回字符串:
@RequestMapping("r4")//也能够不跳转页面直接在当前页面返回字符串。
public void r4(HttpServletResponse response) throws IOException {
response.getWriter().write("succ");
}
复制代码
3.Model,Map:默认将(前缀+请求名+后缀)做为视图:
@RequestMapping("r5")
public Model r5(Model m){
m.addAttribute("msg","kkk");
return m;
}
@RequestMapping("r6")
public Map r5(Map<String,Object> m){
m.put("msg","kkk");
return m;
}
复制代码
4.ModelAndView:
@RequestMapping("r7")
public ModelAndView r7(){
ModelAndView mv = new ModelAndView();
mv.setViewName("main");//设置转发的页面
mv.addObject("msg","ModelAndView");//设置响应信息
return mv;
}
复制代码
5.自定义类型或者自定义类型的集合:以json格式返回
1.导入依赖包:
jackson-annotations-2.7.9.jar
jackson-core-2.7.9.jar
jackson-databind-2.7.9.jar
2.添加注解:@ResponseBody
@RequestMapping("r8")
@ResponseBody
public User r8(){
User user = new User("哈哈哈", 1, new Date());
return user;
}
复制代码
注:做用:@ResponseBody注解用于将Controller的方法返回的对象,经过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,经过Response响应给客户端。
这里导入了新版本依赖包,会自动的转换。
6.SpringMVC引入静态资源文件(js,css)等
两种方式:
1.在SpringMVC配置文件中添加以下内容:
<mvc:resources mapping="/js/**" location="/js/"/>
<!--mapping:不拦截的文件
location:不拦截的文件夹-->
复制代码
2.由默认原始servlet来处理静态资源文件:
<mvc:default-servlet-handler/>
7.SpringMVC中经常使用注解:
1.@RequestParam
1.为处理器的参数指定默认值:
public String an2(@RequestParam(defaultValue = "0") int uid)
复制代码
2.解决处理器的参数名和请求路径的变量名不一致:
public String an1(@RequestParam(value = "id") int uid) //此时请求参数名为:"id"
3.能够将浏览器请求路径上多个同名的变量赋值到一个集合中:请求名?uid=1&uid=3..
@RequestMapping("an3")
public String an3(@RequestParam("uid") List<Integer> list){
System.out.println("uid"+list);
return "index";
}
复制代码
2.@PathVariable:获取请求路径中的变量值(路径变量)
页面请求:请求名/值,例如:
<a href="an4/3"></a>
后台接收:
@RequestMapping("an4/{uid}")
public String an4(@PathVariable("uid") int uid){
System.out.println(uid);
return "index";
}
复制代码
3.@SessionAttributes:将request域对象中的变量同时放到session中。
@SessionAttributes({"uid"})
public class ResController {
@RequestMapping("an5")
public String an5(Model m,int uid){
m.addAttribute("uid",uid);//request中的域对象:"uid"
return "index";
}
}
复制代码
4.@ModelAttritube:能够做用在方法上或者参数上
4.1.做用在参数上:将变量绑定到Model里,等价于m.addAttribute("id",id)
注意:
语法:非自定义类型:@ModelAttritube("变量名 a") 变量名 a
自定义类型:@ModelAttritube("任意定义") 变量名 a,括号也能够省略不写,
默认将变量名为自定义类型首字母小写
@RequestMapping("an6")
public String an6(@ModelAttribute("user") User user){
return "index";
}
复制代码
4.2 做用在方法上:全部处理器在执行前都会执行该方法
注意:该方法能够有返回值,同时在当前请求中能够得到该返回值。
默认返回值对应的变量名为该类型首字母小写做为变量名,
也能够本身手动指定变量名,例如:
@ModelAttribute("msg")//变量名为:msg
测试:
public String an7(@ModelAttribute("uid") int uid){
System.out.println("处理器在执行其余方法以前执行该方法");
return "index111";
}
复制代码
8.文件上传
单文件上传:
步骤:
1.添加文件上传依赖包:
commons-fileupload-1.2.2.jar
commons-io-2.4.jar
2.Jsp页面文件上传表单:
<form action="upfile" method="post" enctype="multipart/form-data">
<input type="file" name="attac" >
<input type="submit" value="上传">
</form>
复制代码
3.在SpringMVC的配置文件中实例化文件解析器:
<!-- 实例化文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置文件上传的最大大小-->
<property name="maxUploadSize" value="60000000"/>
</bean>
复制代码
4.定义接收文件的处理器方法:
@RequestMapping("upfile")//注意MultipartFile attac与请求参数名一致。
public String upfile(Model m, MultipartFile attac, HttpSession session) {
//1.指定上传的文件的位置,2.将接受到的文件保存在指定的位置
String path = "E:/files/";//
System.out.println(path);
File temp = new File(path, attac.getOriginalFilename());
try {
attac.transferTo(temp);
m.addAttribute("msg", "上传成功");
} catch (IOException e) {
e.printStackTrace();
m.addAttribute("msg", "上传失败");
}
return "index";
}
复制代码
多文件上传:
1.jsp页面表单属性为file中,添加属性multiple="multiple"
<form action="upfile" method="post" enctype="multipart/form-data">
<input type="file" name="attac" multiple="multiple">
<input type="submit" value="上传">
</form>
复制代码
2.定义后台处理器方法,能够经过集合或者数组获取多个文件,代码以下
@RequestMapping("upfile")
public String upfile(Model m, MultipartFile[] attac, HttpSession session) {
//1.指定上传的文件的位置,2.将接受到的文件保存在指定的位置
String path="E:/files/";//
System.out.println(path);
for (MultipartFile perf : attac) {
File temp=new File(path,perf.getOriginalFilename());
try {
perf.transferTo(temp);
m.addAttribute("msg", "上传成功");
} catch (IOException e) {
e.printStackTrace();
m.addAttribute("msg", "上传失败");
}
}
return "index";
}
复制代码
有错误还请指出,一块儿学习,努力!