前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >猿蜕变系列5——一文搞懂Controller的花式编写

猿蜕变系列5——一文搞懂Controller的花式编写

作者头像
山旮旯的胖子
发布2020-07-28 16:56:38
1.1K0
发布2020-07-28 16:56:38
举报
文章被收录于专栏:猿人工厂猿人工厂猿人工厂

看过之前的执行流程,相信你对springMVC有了一定的认识。今天我们继续来学习springMVC相关的核心知识,帮助你快速起飞,完成蜕变。

RequestMapping是用于指定程序访问入口的annotation,代表了程序被访问的URI,掌握好它的使用,你就掌握了springMVC的程序入口。你甚至可以使用通配符的方式来指定url,比如:

@RequestMapping("/*mapping.do")

这样就表示url中只要是以mapping.do结尾的就可以被当前方法处理。实际的开发中,这种方式不算常见,大家了解就好。

在@RequestMapping中有一个method属性,可以指定这个方法只处理get或者是post请求:

@RequestMapping(value="/handlePost.do", method = RequestMethod.POST)
       public ModelAndView handlePost(HttpServletRequestreq, HttpServletResponse res) throws Exception{
             
               ModelAndView mv = new ModelAndView();
           mv.addObject("hello", "hello spring web mvc by handlePost");
           mv.setViewName("helloByAnnotation");
           return mv;
}

我们看上面这个例子,只有使用post方法提交请求,handlePost才会被执行,因为method属性指定了方法只能被以post的方式访问。如果不使用method属性,那么无论是get还是post的方式都可以访问。

例子:只能get方式访问

@RequestMapping(value="/handleGet.do", method = RequestMethod.GET)
       public ModelAndView handleGet(HttpServletRequestreq, HttpServletResponse res) throws Exception{
             
               ModelAndView mv = new ModelAndView();
           mv.addObject("hello", "hello spring web mvc by handleGet");
           mv.setViewName("helloByAnnotation");
           return mv;
        }

RequestMapping还提供了params属性来限制请求中的参数。

@RequestMapping(value="/requireParama.do", params={"hello" , "name"})
       public ModelAndViewrequireParama(HttpServletRequest req, HttpServletResponse res) throws Exception {
             
               ModelAndView mv = new ModelAndView();
           mv.addObject("hello", "hello spring web mvc by helloAnnotation");
           mv.setViewName("helloByAnnotation");
           return mv;
        }

要求请求中必须有参数名为hello和name的参数。

@RequestMapping(value="/requireParama2.do", params={"!hello" , "name=pz"})
       public ModelAndView requireParama2(HttpServletRequestreq, HttpServletResponse res) throws Exception{
             
               ModelAndView mv = new ModelAndView();
           mv.addObject("hello", "hello spring web mvc by helloAnnotation" + req.getParameter("name"));
           mv.setViewName("helloByAnnotation");
           return mv;
        }

要求请求中不能出现参数名为hello,但是必须出现参数名为name,并且参数name的值还必须为”pz”.

使用基本类型接收表单参数

我们在开发中会遇到很多表单提交的请求,最常见的就是用户注册页面,我们通过下面这个例子,学习下怎样在Spring MVC中获取表单提交的参数。

示例:

我们首先编写一个jsp页面:form.jsp(注意:直接放在webapp目录下,因为我们需要直接访问,这样处理比较简单)

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<html>
<head>
<title>spring form表单样例</title>
</head>
<body>
   <form action="/submitForm.do"method=post>
    <lable>姓名:</lable>
      <input type="text"name="name" id="name"/><br />
    <lable>电话:</lable>
     <input type="text"name="phone" id="phone"/><br />
      <lable>年龄:</lable>
     <input type="text"name="age" id="age"/><br />
      <input type="submit"value="提交"id="submit" /><br />
   </form>
</body>
</html>

然后,编写一个controller来接收表单提交的参数:

package com.pz.web.study.springmvc.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
 
@Controller
publicclass FormControllerDemo {
      
       @RequestMapping("/submitForm.do")
       public ModelAndView submitForm(String name, Stringphone) throws Exception {
             
               ModelAndView mv = new ModelAndView();
           mv.addObject("name", name);
           mv.addObject("phone", phone);
           mv.setViewName("showForm");
           return mv;
        }
 
}

再编写一个jsp页面(showForm.jsp)用于展示从表单获取的数据:

<%@ page language="java" contentType="text/html;charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<html>
<head>
<title>spring form表单样例</title>
</head>
<body>
    <lable>姓名:</lable>
      ${name} <br />
    <lable>电话:</lable>
      ${phone}<br />
    <lable>年龄:</lable>
      ${age}<br />
</body>
</html>
 

访问http://127.0.0.1/form.jsp,输入姓名和电话以及年龄 点击提交 就可以看到我们之前输入的姓名和电话以及年龄的内容了。

注意,此时姓名和电话如果输入中文,会产生乱码,不要惊慌,稍后我们会讲到如何处理。年龄填数字要不程序会出错。

仔细观察代码,我们发现在上面的例子中,我们编写的Controller的submitForm方法和之前例子中编写的不一样,我们并没有要求HttpServletRequest和HttpServletResponse对象作为方法入参,而是直接使用了两个String类型和int类型去接收参数,参数名和表单input字段的name属性是一致的。因为这样定义方法参数,Spring MVC 会根据表单里的name属性自动将表单数据填充到名字匹配的参数中去。我们能够方便的使用表单参数而不是像使用servlet一样rquest.getParameter()。

其实编写Controller代码,我们编写方法的时候,并不要求方法需要固定HttpServletRequest和HttpServletResponse对象作为入参,即使一个参数也没有,方法也能执行。只不过SpringMVC只会自动填充以下几个参数:

HttpServletRequest

HttpServletResponse

HttpSession

org.springframework.ui.Model

请求参数乱码问题处理

在上面的例子中,我们已经发现了问题,如果输入中文,我们获取到的数据会有乱码问题。对于这个问题Spring MVC也提供了解决办法,就是使用Filter,只不过这个Filter我们无需自己编写,用Spring MVC提供的org.springframework.web.filter.CharacterEncodingFilter就好。我们在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>
 
              <!--强制指定字符编码,forceEncoding如果设置为true,即使我们已经在提交表单时指定了字符编码,也会被强制设置为当前配置的字符编码 -->
              <init-param>
                     <param-name>forceEncoding</param-name>
                     <param-value>true</param-value>
              </init-param>
 
       </filter>
       <filter-mapping>
              <filter-name>characterEncodingFilter</filter-name>
              <url-pattern>/*</url-pattern>
       </filter-mapping>

需要注意forceEncoding的属性值,如果设置为true,即使我们已经在提交表单时指定了字符编码,也会被强制设置为当前配置的字符编码。

重新启动web服务器,输入中文看看效果:访问页面

http://127.0.0.1/form.jsp输入中文试试吧。

请求参数名和Controller参数名不一致问题

大家来思考一个问题,如果表单中input标签的name属性和Controller中的参数名称保持一致会有什么问题?从安全性上来讲,这样设计并不合理,容易产生页面字段暴露后端设计的问题,相对来说不安全(实际上验证到位了也没问题)所以往往有的在开发的时候,有时候会要求页面字段和后端字段在名字必须区分,为了解决这个问题,Spring MVC提供了@RequestParam注解用于绑定表单中<input>标签的name属性和Controller中方法入参。@RequestParam注解有三个属性:

§ value:请求参数的名称,用于绑定请求入参和Controller方法入参。

§ required:设置该参数必须传入,注意一但设置,默认值为true,如果是非必传字段无需设置该属性。

§ defaultValue:参数默认值,如果请求参数没有当前的参数或者当前请求参数的值为null,那么会赋予当前参数一个默认值,如果请求参数传了值,那么就以传入的为准。

我们看下面这个例子:

新建一个表单form2.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<html>
<head>
<title>spring form表单样例</title>
</head>
<body>
   <form action="/submitForm2.do"method=post>
    <lable>姓名:</lable>
      <input type="text"name="userName" id="userName"/><br />
    <lable>电话:</lable>
     <input type="text"name="cellPhone" id="phone"/><br />
    
      <input type="submit"value="提交"id="submit" /><br />
   </form>
</body>
</html>

编写Controller代码:

 @RequestMapping("/submitForm2.do")
       public ModelAndView submitForm2(@RequestParam(value="username") String name, @RequestParam(value="cellPhone",required=true) String phone , @RequestParam(value="userAge",defaultValue="18") int age) throws Exception {
             
               ModelAndView mv = new ModelAndView();
           mv.addObject("name", name);
           mv.addObject("phone", phone);
           mv.addObject("age", age);
           mv.setViewName("showForm");
           return mv;
        }
 

访问:http://127.0.0.1/form2.jsp,分别做以下事情:

1.所有表单字段都填写然后提交

2.访问url:http://127.0.0.1/submitForm2.do?userName=1

大家要注意一个事情,required是指请求参数里必须出现,如果表单里的input标签的name属性出现了对应设置required的属性名,但是不填充,这种情况请求中依然会出现name对应的参数,只是值往往是空字符串,如果使用required属性来处理这种场景是错误了,这也是个学习误区。

使用对象接收请求参数

我们之前都是使用的基本类型或者HttpServletRequest来接收请求参数,这样会产生一个问题,那就是请求参数过多,那我们的Controller方法就会变得冗长无比,代码比也随之丑陋无比,难以维护。而且我们的参数,最终往往需要作为对象来传递,使用基本类型或者是HttpServletRequest来接收参数,还需要把参数值设置到需要操作的对象中。SpringMVC提供了办法,可以直接将页面参数与对象进行绑定从而解决了这个问题。我们可以创建一个JavaBean,要求属性名和请求参数名一致即可。我们一起看看下面这个例子:

编写一个User类,让属性名和请求参数一致:

package com.pz.web.study.springmvc.domain;
 
public class User {
      
       private String userName;
      
       private String cellPhone;
      
       private int age;
 
       public String getUserName() {
              returnuserName;
       }
 
       public void setUserName(String userName) {
              this.userName = userName;
       }
 
       public String getCellPhone() {
              returncellPhone;
       }
 
       public void setCellPhone(String cellPhone) {
              this.cellPhone = cellPhone;
       }
 
       public int getAge() {
              returnage;
       }
 
       public void setAge(int age) {
              this.age = age;
       }
      
      
 
}

编写一个新的页面form3.jsp让input的name属性保持和User类的属性一致:

<%@ page language="java" contentType="text/html;charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<html>
<head>
<title>spring form表单样例使用对象接收参数</title>
</head>
<body>
   <form action="/submitForm2.do"method=post>
    <lable>姓名:</lable>
      <input type="text"name="userName" id="userName"/><br />
    <lable>电话:</lable>
     <input type="text"name="cellPhone" id="phone"/><br />
     <lable>年龄:</lable>
       <input type="text"name="age" id="age"/><br />
    
      <input type="submit"value="提交"id="submit" /><br />
   </form>
</body>
</html>

编写一个Controller方法:

@RequestMapping("/submitForm3.do")
       public ModelAndView submitForm2(User user) throws Exception {
               ModelAndView mv = new ModelAndView();
           mv.addObject("user", user);
           mv.setViewName("showForm3");
           return mv;
        }

编写一个新的展示页面,顺便复习下el表达式输出对象

<%@ page language="java" contentType="text/html;charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<html>
<head>
<title>spring form表单样例</title>
</head>
<body>
    <lable>姓名:</lable>
      ${user.userName} <br />
    <lable>电话:</lable>
      ${user.cellPhone}<br />
    <lable>年龄:</lable>
      ${user.age}<br />
</body>
</html>
 

访问页面

http://127.0.0.1/form3.jsp

对象属性参数的接收

其实在一次请求中,我们的数据和接收数据的JavaBean往往有一些冲突,比如在表单中填写的一些数据项,好几项合在一起,组合起来是JavaBean的一个属性。比如我们要求页面再填写用户的详细地址(包含省、市、区),此时,用户详细地址仅仅是User对象的一个属性address。当这种情况发生时,我们依然可以将请求参数转化为User对象,只是,涉及到User类中的address的相关数据,我们需要采用对象名.方法名的形式来处理(需要注意的是,请求参数中的“对象名”,需要和Controller方法入参的对象名相同,“属性名”也需要保持一致)。如下所示:

packag ecom.pz.web.study.springmvc.domain;
 
public class Address {
       //省
       private String provice;
       //市
       private String city;
      
       //区
       private String area;
      
       //详细地址
       private String detailAddress;
 
       public String getProvice() {
              returnprovice;
       }
 
       public void setProvice(String provice) {
              this.provice = provice;
       }
 
       public String getCity() {
              returncity;
       }
 
       public void setCity(Stringcity) {
              this.city = city;
       }
 
       public String getArea() {
              returnarea;
       }
 
       public void setArea(Stringarea) {
              this.area = area;
       }
 
       public String getDetailAddress() {
              returndetailAddress;
       }
 
       public void setDetailAddress(String detailAddress) {
              this.detailAddress =detailAddress;
       }
      
      
 
}
package com.pz.web.study.springmvc.domain;
 
public class User {
      
       private String userName;
      
       private String cellPhone;
      
       privateintage;
      
       private Address address;
 
       public String getUserName() {
              returnuserName;
       }
 
       publicvoidsetUserName(String userName) {
              this.userName = userName;
       }
 
       public String getCellPhone() {
              returncellPhone;
       }
 
       publicvoidsetCellPhone(String cellPhone) {
              this.cellPhone = cellPhone;
       }
 
       publicint getAge() {
              returnage;
       }
 
       publicvoid setAge(int age) {
              this.age = age;
       }
 
       public Address getAddress() {
              returnaddress;
       }
 
       publicvoidsetAddress(Address address) {
              this.address = address;
       }
      
      
      
      
 
}

编写一个新页面form4.jsp

<%@ page language="java" contentType="text/html;charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<html>
<head>
<title>spring form表单样例使用对象接收参数</title>
</head>
<body>
   <form action="/submitForm4.do"method=post>
    <lable>姓名:</lable>
      <input type="text"name="userName" id="userName"/><br />
    <lable>电话:</lable>
     <input type="text"name="cellPhone" id="phone"/><br />
     <lable>年龄:</lable>
       <input type="text"name="age" id="age"/><br />
      
         <lable>省:</lable>
       <input type="text"name="address.provice" id="age" /><br />
      
         <lable>市:</lable>
       <input type="text"name="address.city" id="age" /><br />
      
         <lable>区:</lable>
       <input type="text"name="address.area" id="age" /><br />
      
         <lable>详细地址:</lable>
       <input type="text"name="address.detailAddress" id="age" /><br />
    
      <input type="submit"value="提交"id="submit" /><br />
   </form>
</body>
</html>

编写一个新的Controller方法

@RequestMapping("/submitForm4.do")
       public ModelAndView submitForm4(User user) throws Exception {
               ModelAndView mv = new ModelAndView();
           mv.addObject("user", user);
           mv.setViewName("showForm4");
           return mv;
        }
 

编写一个新的页面展示数据showForm4.jsp

<%@ page language="java" contentType="text/html;charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<html>
<head>
<title>spring form表单样例</title>
</head>
<body>
    <lable>姓名:</lable>
      ${user.userName} <br />
    <lable>电话:</lable>
      ${user.cellPhone}<br />
    <lable>年龄:</lable>
      ${user.age}<br />
      <lable>省:</lable>
      ${user.address.provice}
      <br /> 
      <lable>市:</lable>
       ${user.address.city}<br /> 
         <lable>区:</lable>
       ${user.address.area}<br /> 
        <lable>详细地址:</lable>
       ${user.address.detailAddress}<br />
    
      <input type="submit"value="提交"id="submit" /><br />
</body>
</html>

启动应用,访问http://127.0.0.1/form4.jsp

填写表单数据,点击提交按钮,看看效果吧。

使用路径变量处理请求参数

除了之前的请求参数处理方式之外,Spring MVC还提供了PathVariable——路径变量来接收请求参数。

PathVariable是一个定义在方法上的Annotation,它使用下面这个属性绑定url和参数间的关系

value:请求参数的名称,用于绑定请求入参和Controller方法入参。

我们看下面这个例子:

编写一个新的方法

   @RequestMapping("/{userName}/{cellPhone}/submitForm5.do")
       public ModelAndView submitForm5(@PathVariable(value="userName") String name, @PathVariable(value="cellPhone") String phone) throws Exception {
             
               ModelAndView mv = new ModelAndView();
           mv.addObject("name", name);
           mv.addObject("phone", phone);
           mv.setViewName("showForm");
           return mv;
        }

启动应用,直接访问

http://127.0.0.1/pangzi/123/submitForm5.do

这样看上去是不是很酷?

有兴趣的话自行搜索下restful

大家有没有发现我们之前编写的Controller方法的返回值类型都是统一的ModelAndView?我要告诉大家一个比较失落的事情就是,这种写法并不是最常用的(至于为什么,后面会讲到),因为Spring MVC并不要求Controller方法必须具备某种返回值,在实际应用的时候,下面几种返回值类型大家可以参考下:

§ ModelAndView

§ String

§ void

§ 自定义类型

返回ModelAndView

ModelAndView,是一个视图对象,我们在使用的时候还需要调用setView方法来设置视图。其实我们已经配置了默认的视图了:

<!-- 视图解析器-->
  <bean
     class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix"value="/WEB-INF/" />
    <property name="suffix"value=".jsp" />
  </bean>

按照这个配置JSP就是我们的默认视图! 如果程序的功能只是转发数据到JSP或者说程序无需转发,直接返回数据(之前我们《7天web开发入门》中提及的基本都是ajax类型的噢)。使用ModlAndView就有些多余了。

返回String类型

如果controller中的方法是String类型,那么方法执行完毕之后,返回的String值就是默认的视图名,比如我们配置的是JSP,那么默认情况下会将数据转发到对应的JSP视图。绝大多数情况下,一个String就搞定了!

我们来看看例子:

package com.pz.web.study.springmvc.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
 
@Controller
public class ReturnTypeControllerDemo {
      
       @RequestMapping("/returntype/submitForm.do")
       public String submitForm(String name, String phone ,int age,Model model) throws Exception {
             
              model.addAttribute("name", name);
              model.addAttribute("age", age);
              model.addAttribute("phone", phone);
           return"showForm";
        }
      
      
      
      
}

启动应用,在浏览器的地址栏中输入:

http://127.0.0.1/returntype/submitForm.do?name=pz&phone=138&age=18

页面显示:

姓名:pz 电话:138 年龄: 18

注意:String 返回值类型是最常用的类型,比ModelAndView更加简洁!

关于Model对象

Model,是一个接口,Spring MVC 可以key/value的形式给Model注入数据,也就是说编写Controller方法时,我们可以使用Model对象做数据传递的相关事情。我们回到上面的例子注意代码:

model.addAttribute("name", name);

model.addAttribute("age", age);

model.addAttribute("phone", phone);

这样就将参数设置到了对象变量中。我们在页面直接使用变量名输出即可。

返回void或者返回null

我们之前的猿进化系列中,已经处理过ajax的异步请求,我们返回了json数据格式,实际上,对于无需跳转,或者是由外部来控制(比如js)的请求,我们可以使用void做返回值,或者我们直接返回null。我们看下面这个例子。

由于我们会用到fastjson,我们新增依赖:

<!-- fastjson-->
        <dependency>
                     <groupId>com.alibaba</groupId>
                     <artifactId>fastjson</artifactId>
                     <version>1.2.8</version>
              </dependency>

编写jsp页面:

<%@ page language="java" contentType="text/html;charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<!DOCTYPE html >
<html>
<head>
<title>spring form表单样例使用对象接收参数</title>
<script src="js/jquery-3.3.1.js"></script>
 
<script>
 
$(function () {
 
       $("#submitForm2").submit(function(){
              //1.发送数据到服务器
                     $.post("returntype/submitForm2.do",$(this).serialize(),function(data){
                            //处理服务器响应的数据 data  {flag:true,errorMsg:"注册失败"}
 
                            if(data.flag){
                                //后端处理成功,跳转到应该跳转的页面
                                alert("后端处理成功,可以在此处做页面跳转或者是页面上的其他操作");
                                   location.href="http://www.baidu.com";
                            }else{
                                //后端处理失败,输出失败信息
                                   $("#errorMsg").html(data.errorMsg);
 
                            }
                     });
 
              //2.不让页面跳转
        returnfalse;
        //如果这个方法没有返回值,或者返回为true,则表单提交,如果返回为false,则表单不提交
       });
      
 
});
</script>
 
</head>
<body>
   <form action="#"method=post id="submitForm2">
    <lable>姓名:</lable>
      <input type="text"name="userName" id="userName"/><br />
    <lable>电话:</lable>
     <input type="text"name="cellPhone" id="phone"/><br />
     <lable>年龄:</lable>
       <input type="text"name="age" id="age"/><br />
    
      <input type="submit"value="提交" id="submit"/><br />
      <span id="errorMsg"style="color:red"></span>
   </form>
</body>
</html>

编写Controller代码,在ReturnTypeControllerDemo中增加方法:

@RequestMapping("/returntype/submitForm2.do")
       public String submitForm2(String name, String phone, HttpServletResponse response) throws Exception{
              ResultInfo info = new ResultInfo();
              info.setFlag(true);
              responseJson(info,response);
          returnnull;
        }
      
      
        /**
     * 直接将传入的对象序列化为json,并且写回客户端
     * @param obj
     */
    public void responseJson(Object obj,HttpServletResponse response) throws IOException {
         
          response.setDateHeader("Expires", 0);
          response.setContentType("application/json;charset=utf-8");
          response.setHeader("Cache-Control", "no-cache");
          response.setHeader("Pragma", "no-cache");
          response.setCharacterEncoding("UTF-8");
          response.getWriter().write(JSON.toJSONString(obj));
          response.getWriter().flush();
         
}

当然,你也可以将返回值设置为void,也是可以的,这个不纠结。

修改代码将public StringsubmitForm2(String name, String phone , HttpServletResponse response) 返回值改为 void:

public voidsubmitForm2(String name, String phone , HttpServletResponse response)

试试。效果也是一样的。

JSON格式的方式返回Object

上面一节我们其实已经使用json格式返回数据了,但是需要我们自己编写方法,将字符串打印到页面上,相对来讲不太美观(其实也无伤大雅),Spring MVC也提供了办法,可以直接返回json数据格式。Web技术发展到今天,前后端都分离了,这种方式可能是最常用的方式之一了。

Spring MVC 原生支持的是jackson,但是我们已经使用了fastjson,我们就用fastjson吧。

第一步:修改配置文件spring-servlet.xml增加配置:

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                        <value>application/xml;charset=UTF-8</value>
                    </list>
                </property>
                <property name="features">
                    <list>
                    <!-- 默认的意思就是不配置这个属性,配置了就不是默认了 -->
                       <!-- 是否输出值为null的字段 ,默认是false-->
                        
                        <value>WriteMapNullValue</value>
                        
                        <value>WriteNullNumberAsZero</value>
                        <value>WriteNullListAsEmpty</value>
                        <value>WriteNullStringAsEmpty</value>
                        <value>WriteNullBooleanAsFalse</value>
                        <value>WriteDateUseDateFormat</value>
                    
                    </list>
                </property>
            </bean>
               
     </mvc:message-converters>
     </mvc:annotation-driven>

如果使用的是jackson这一步配置只用写上<mvc:annotation-driven/>。当然,还得增加jackson的相关依赖。

我们再编写个页面:

<%@ page language="java" contentType="text/html;charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<!DOCTYPE html >
<html>
<head>
<title>spring form表单样例使用对象接收参数</title>
<script src="js/jquery-3.3.1.js"></script>
 
<script>
 
$(function () {
 
       $("#submitForm3").submit(function(){
              //1.发送数据到服务器
                     $.post("returntype/submitForm3.do",$(this).serialize(),function(data){
                            //处理服务器响应的数据 data  {flag:true,errorMsg:"注册失败"}
 
                            if(data.flag){
                                //后端处理成功,跳转到应该跳转的页面
                                alert("后端处理成功,可以在此处做页面跳转或者是页面上的其他操作");
                                   location.href="http://www.baidu.com";
                            }else{
                                //后端处理失败,输出失败信息
                                   $("#errorMsg").html(data.errorMsg);
 
                            }
                     });
 
              //2.不让页面跳转
        returnfalse;
        //如果这个方法没有返回值,或者返回为true,则表单提交,如果返回为false,则表单不提交
       });
      
 
});
</script>
 
</head>
<body>
   <form action="#" method=post id="submitForm3">
    <lable>姓名:</lable>
      <input type="text"name="userName" id="userName"/><br />
    <lable>电话:</lable>
     <input type="text"name="cellPhone" id="phone"/><br />
     <lable>年龄:</lable>
       <input type="text"name="age" id="age"/><br />
    
      <input type="submit"value="提交" id="submit"/><br />
      <span id="errorMsg"style="color:red"></span>
   </form>
</body>
</html>

编写Controller方法

@RequestMapping("/returntype/submitForm3.do")
       @ResponseBody
       public ResultInfo submitForm3(String name, String phone ,HttpServletResponseresponse) throws Exception {
              ResultInfo info = new ResultInfo();
              info.setFlag(true);
              return info;
        }

注意:我们增加了Annotation@ResponseBody!这样写就默认返回json了。

启动应用 访问页面:

http://127.0.0.1/ajaxform2.jsp

点击提交就看到效果了。

希望大家可以思考一下,我们返回json使用了3种方式吧?其实要实现某种功能有多种办法,我们要学会怎样灵活运用自己已经掌握的技术,去实现需求。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 猿人工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用基本类型接收表单参数
  • 请求参数乱码问题处理
  • 请求参数名和Controller参数名不一致问题
  • 使用对象接收请求参数
    • 对象属性参数的接收
    • 使用路径变量处理请求参数
    • 返回ModelAndView
    • 返回String类型
    • 关于Model对象
    • Model,是一个接口,Spring MVC 可以key/value的形式给Model注入数据,也就是说编写Controller方法时,我们可以使用Model对象做数据传递的相关事情。我们回到上面的例子注意代码:
    • 返回void或者返回null
    • JSON格式的方式返回Object
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档