SpringMVC学习[02]:【值传递、编码过滤器、类型转换器的配置、SpringMVC的转发与重定向、SpringMVC中经常使用注解、文件上传】

内容:
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";
}
复制代码


有错误还请指出,一块儿学习,努力!
相关文章
相关标签/搜索