springmvc 入门和数据绑定

springmvc 入门和数据绑定

1. spring配置
  • (1) web初始化配置

     <!--DispatchServlet-->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <!--
                DispatcherServlet是Spring MVC最核心的对象
                DispatcherServlet用于拦截Http请求,
                并根据请求的URL调用与之对应的Controller方法,来完成Http请求的处理
            -->
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--applicationContext.xml
    			加载指定的spring配置文件
    		-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:applicationContext.xml</param-value>
            </init-param>
            <!--
                在Web应用启动时自动创建Spring IOC容器,
                并初始化DispatcherServlet(可选)
            -->
            <load-on-startup>0</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <!--"/" 代表拦截所有请求-->
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
  • (2)spring初始化配置

     <!--
        context:component-scan 标签作用
        在Spring IOC初始化过程中,自动创建并管理com.imooc.springmvc及子包中
        拥有以下注解的对象.
        @Repository
        @Service
        @Controller
        @Component
        -->
    	<!-- base-package 指定扫描包-->
        <context:component-scan base-package="com.imooc.springmvc"></context:component-scan>
        <!--启用Spring MVC的注解开发模式-->
        <mvc:annotation-driven />
        <!-- 将图片/JS/CSS等静态资源排除在外,不使用spring过滤,可提高执行效率 -->
        <mvc:default-servlet-handler/>
    
2.URLMapping(映射)
(1) 分类
  • @RequestMapping

通过@RequestMapping(value = "url",method = RequestMethod.GET)来指定get/post/delte等方法

  • 该方法作用在类上,可为类添加全局通用映射.

  • 该方法作用在方法上,不区分get/post方法

  • @GetMapping

  • @PostMapping

  • @ResponseBody

    使method不经过视图解析器,直接输出为json字符串,一般和URLMapping配合使用

(2) 使用
方法参数接受请求参数

实例代码-1

<form action="/um/p1" method="post">
        <input name="username"><br/>
        <input name="password"><br/>
    </form>
 @PostMapping("/p")
    @ResponseBody
    public String postMapping(String username,Long password){
        System.out.println(username+":"+password);
        return "This is post method";
    }

一般要保证method的参数名和请求参数名名称相同

spring可以实现数值类型和字符串类型的相互转换(前提:string类型的内容为纯数字)

实例代码-2

<!--假定request请求url为:localhost:8080/um/p1?manager_name=li -->
<!-- 相应的java代码如下-->    
	@GetMapping("/p1")
    @ResponseBody
   
    <!--@RequestParam("manager_name")的原理:将request请求中的manager_name在运行时动态的注入其后的
    managerName参数中,从而实现自定义参数对照关系 -->
    public String getMapping(@RequestParam("manager_name") String managerName , Date createTime){
        System.out.println("managerName:"+managerName);
        return "This is get method";
    }
javaBean接受请求参数

实例代码-3

<!--User.java -->
public class User {

    private String username;
    private Long password;


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Long getPassword() {
        return password;
    }

    public void setPassword(Long password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password=" + password +
                '}';
    }
}

<!--假定request请求url为:localhost:8080/test2?username=lihua&password=123456789 -->
<!-- 需要使request请求的各参数名和User.java中各参数名一一对应,
    才能完成javabean的创建和动态注入工作
    (request请求的参数可以少但不能多)-->
<!-- 相应的java代码如下-->  
	@PostMapping("/test2")
    @ResponseBody
    public void test2(User user) {
        System.out.println(user);
    }
接受表单复合数据
  • 利用数组或者list接受请求中的复合数据

  • 利用@RequestParam为参数设置默认值

    示例代码-4

    <!--假定request请求url为:localhost:8080/um/p1?manager_name=li -->
    <!-- 相应的java代码如下-->    
    	@GetMapping("/p1")
    @ResponseBody
    
     <!--@RequestParam(value = "next",defaultValue = "none")的原理:
     将request请求中的next参数在运行时动态的注入其后的managerName参数中,如果在request请求中next的值为null,则将"none"赋值给managerName 
     -->
    
      public String getMapping(@RequestParam(value = "next",defaultValue = "none") String managerName ){
         System.out.println("managerName:"+managerName);
         return "This is get method";
     }
    
  • 使用Map对象接受请求参数及注意事项

map常用于接受表单数据,但当数据中包含复合数据时,map只能取到第一个值

假定表单中包含一个[1,2,3,4]的复合数据,使用map接收后,map只能得到第一个值:1

示例html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学员调查问卷</title>
    <style>
        .container {
            position: absolute;
            border: 1px solid #cccccc;
            left: 50%;
            top: 50%;
            width: 400px;
            height: 300px;
            margin-left: -200px;
            margin-top: -150px;
            box-sizing: border-box;
            padding: 10px;
        }
        h2{
            margin: 10px 0px;
            text-align: center;
        }
        h3{
            margin: 10px  0px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>学员调查问卷</h2>
        <form action="./apply" method="post">
        <h3>您的姓名</h3>
        <input name="name" class="text"  style="width: 150px">
        <h3>您正在学习的技术方向</h3>
        <select name="course" style="width: 150px">
            <option value="java">Java</option>
            <option value="h5">HTML5</option>
            <option value="python">Python</option>
            <option value="php">PHP</option>
        </select>
        <div>
            <h3>您的学习目的:</h3>
            <input type="checkbox" name="purpose" value="1">就业找工作
            <input type="checkbox" name="purpose" value="2">工作要求
            <input type="checkbox" name="purpose" value="3">兴趣爱好
            <input type="checkbox" name="purpose" value="4">其他
        </div>
        <div style="text-align: center;padding-top:10px" >
            <input type="submit" value="提交" style="width:100px">
        </div>
        </form>

    </div>
</body>
</html>

示例代码-5

@PostMapping("/apply")
 @ResponseBody
<!--使用list接受复合数据 
 需要在方法前添加 @RequestParam,向springmvc说明使用list接受复合数据
-->
 <!--
 表单复合数据也可以通过javabean接收,而无需配置@RequestParam
 相关的规范和' javaBean接受请求参数'的规范完全相同,见示例代码-6
 -->
 public String apply(String name, String course, @RequestParam List<Integer> purpose){
     System.out.println(name);
     System.out.println(course);
     for (Integer p : purpose) {
         System.out.println(p);
     }
     return "SUCCESS";
 }
	<!--使用数组接受复合数据 
    添加 @RequestParam(可选)
 -->
  public String apply(String name, String course,  Integer[] purpose){
     System.out.println(name);
     System.out.println(course);
     for (Integer p : purpose) {
         System.out.println(p);
     }
     return "SUCCESS";
 }

示例代码-6

public class Form {
    private String name;
    private String course;
    private List<Integer> purpose;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCourse() {
        return course;
    }

    public void setCourse(String course) {
        this.course = course;
    }

    public List<Integer> getPurpose() {
        return purpose;
    }

    public void setPurpose(List<Integer> purpose) {
        this.purpose = purpose;
    }
}
关联对象赋值

示例代码-7

public class User{
    private String username;
    private String password;
    private Idcard idcard = new Idcard();
    //geter or setter
}
public class Idcard{
 	private String name;
    private String idno;
    private String expire;
    //getter or setter
}

相对应的form表单设置应该如下图

在使用关联对象赋值时,要把关联对象的对象名,放在表单对象name中的前面

日期类型转换
  1. 使用注解实现日期类型转换

    • 方法参数接收请求参数

      @PostMapping("/p1")
          @ResponseBody
          public String postMapping1(User user , String username ,@DateTimeFormat(pattern = "yyyy-MM-dd") Date createTime){
              System.out.println(user.getUsername() + ":" + user.getPassword());
              return "<h1>这是Post响应</h1>";
          }
      

      @DateTimeFormat(pattern = "yyyy-MM-dd") 表明了 日期的输入格式,当请求参数的格式和指定格式相同时,会自动转换为Date类型

    • javabean接收请求参数

      public class User {
      
          private String username;
          private Long password;
          @DateTimeFormat(pattern = "yyyy-MM-dd")
          private Date createTime;
          .......
      }
      

      当在java类中使用@DateTimeFormat(pattern = "yyyy-MM-dd"),就不需要控制器类相应方法的参数前添加

      @DateTimeFormat

  2. 使用xml配置和日期转换类实现日期类型转换

   	
   	<!--日期转换类需要实现 Converter接口,并指明类型转换的双方 -->
   	public class Convter implements Converter<String, Date> {
   	    @Override
   	    public Date convert(String s) {
   	        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
   	        try {
   	            Date date = sdf.parse(s);
   	            return date;
   	        } catch (ParseException e) {
   	            e.printStackTrace();
   	            return null;
   	        }
   	
   	    }
   	}
	<mvc:annotation-driven conversion-service="ConversionService"/>
	
	<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="ConversionService">
	        <property name="converters">
	            <set>
	                <bean class="com.reyking.Convter"></bean>
	            </set>
	        </property>
	    </bean>
	

温馨提示:当xml配置和注解配置同时存在时,springmvc会优先使用xml配置来完成日期类型转换

(3)其他
中文乱码
  1. get请求乱码–server.xml增加URIEncoding属性

    tomcat 8.0 以上不需要配置

  2. post请求乱码–web.xml增加CharacterEncodingFilter

      <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. response响应乱码–spring配置文件配置message-converters

      <mvc:annotation-driven conversion-service="ConversionService">
            <mvc:message-converters >
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html;charset=utf-8</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
3.响应输出结果
1.@ResponseBody - 产生响应文本
  1. @ResponseBody 直接产生响应体数据,过程不涉及任何视图
  2. @ResponseBody 可以产生标准字符串、json、xml等格式数据
  3. @ResponseBody 可被StringHttpMessageConverter影响
2.ModelAndView - 利用模板引擎渲染输出
  1. ModelAndView对象是指“模型(数据)与视图(界面)对象
  2. 通过ModelAndView 可将数据对象与模板引擎进行绑定
  3. springMvc默认的View是JSP,也可以配置其他模板引擎
基本使用
 @GetMapping("/test4")
   public ModelAndView test4(Integer id, String username) {
       <!--指明视图的所在地址 -->
       ModelAndView view = new ModelAndView("/view.jsp");
       if (id == 1) {
           username = "李希";
       }
       view.addObject("username", username);
       return view;
   }
***  ***  ***   ***    ***   ***    ***
@GetMapping("/test5")
   public String test5(Integer id, String username, ModelMap modelMap) {
       String view = "/view.jsp";
       if (id == 1) {
           username = "李希";
       }
       modelMap.addAttribute("username", username);
       return view;
   }
// 方法test5是方法test4的变种,两者实现相同的功能
   <!--
   controller 方法返回string的情况
   1.方法被 @ResponseBody 描述,springmvc直接响应字符串本身
   2.spring mvc 处理strng处理的视图
   -->

<!--view.jsp -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
username:${username}
</body>
</html>

ModelAndView view = new ModelAndView("/view.jsp"); 可以使用下面的代码代替

`ModelAndView view = new ModelAndView();`
	view.setViewName("/view.jsp");
核心用法
4.springmvc与freemarker整合
1. 依赖
		<dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
        </dependency>
		<!--spring mvc支持包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
2.xml配置
//视图解析器
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver" id="freeMarkerViewResolver">
    // 指明响应时页面的内容编码
        <property name="contentType" value="text/html;charset=utf-8"></property>
    //表明文件后缀
        <property name="suffix" value=".ftl"/>
    </bean>

//freemarker配置
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer" id="freeMarkerConfigurer">
        //指明ftl文件的加载位置
        <property name="templateLoaderPath" value="/WEB-INF/ftl"/>
        <property name="freemarkerSettings">
            <props>
                //指明freemarker的编码格式
                <prop key="defaultEncoding">UTF-8</prop>
            </props>
        </property>
    </bean>
3. 实际使用
  @GetMapping("/test")
    public ModelAndView showTest(){
        ModelAndView mav = new ModelAndView("/test");
        User user = new User();
        user.setUsername("andy");
        mav.addObject("u", user);
        return mav;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值