码迷,mamicode.com
首页 > 编程语言 > 详细

SpringMVC常用注解

时间:2018-07-21 14:34:20      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:...   ping   map   get   控件   login   package   character   container   

一、@RequestMapping的位置

1、加在方法前
2、加在类前
例如:创建 /jsp/school/list.jsp 和 SchoolController.java
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>XXX</title>
</head>
<body>
<h1>XXXXXX</h1>
</body>
</html>
 
package com.qfedu.springmvc.controller;

@Controller
@RequestMapping("/school")
public class SchoolController {

@RequestMapping("/list")
public String list(){

return "school/list";
}
}
重启tomcat,程序的访问路径是:http://localhost:8080/school/list

二、@RequestMapping的请求方式

1、默认情况下,处理器可以同时接收post形式和get形式的请求
例如:创建/jsp/login.jsp 、/jsp/success.jsp 和 LoginController.java
login.jsp
<h1>登录</h1>
<form action="do_login">
<p><label for="username">用户名</label><input type="text" name="username" id="username"></p>
<p><label for="password">密码</label><input type="password" name="password" id="password"></p>
<p><button>登录</button></p>
</form>
success.jsp
<h1>成功</h1>
LoginController.java
@Controller
public class LoginController {

@RequestMapping("/login")
public String login(){

return "login";
}

@RequestMapping("/do_login")
public String doLogin(){
return "success";
}
}
重启tomcat,程序的访问路径是:http://localhost:8080/login
输入用户名和密码程序跳转到:http://localhost:8080/do_login?username=admin&password=12345
此时表单为默认的get形式发送的请求 
2、可以将表单的请求方式改为 post
<form action="do_login" method="post">
刷新页面后重新测试。
 
3、可以将处理器中的注解修改成只接收post请求的方式
@RequestMapping(value="/do_login", method= RequestMethod.POST)
public String doLogin(){
return "success";
}
 
测试:如果请求方式和接收方式不匹配,会发生405错误
技术分享图片
4、总结
(1)GET形式:@RequestMapping(value="/do_login", method=RequestMethod.GET)
  • 通过URL地址直接访问
  • 或通过a标签的超链接访问
例如:index.jsp中添加
<div><a href="login">登录</a></div>
  • 表单中的 <form method="get">
  • ajax get
 
(2)POST形式
  • @RequestMapping(value="/do_login", method=RequestMethod.POST)
表单中的 <form method="post">
  • ajax post
(3)注意
  • 如果不明确指定method参数,那么可以接收任何类型的请求
  • 如果明确指定,但是类型不匹配,那么会出现 405 错误

三、处理请求参数

1、在控制层方法的参数中处理请求参数:
  • 参数名和表单中控件的name属性保持一致
  • 可以接收get和post所有形式的传参
@RequestMapping(value="/do_login", method= RequestMethod.POST)
public String doLogin(String username, String password){
System.out.println(username);
System.out.println(password);
return "success";
}
 
2、@RequestParam处理请求参数
上面的例子也可以写成下面的形式
public String doLogin(@RequestParam String username, @RequestParam String password){
或(@RequestParam中的默认参数和表单中控件的name属性保持一致)
public String doLogin(@RequestParam("username") String username, @RequestParam("password") String password){
 
3、配置可选的参数
在控制层添加一个参数:“验证码 code”,测试登录功能发现400错误
@RequestMapping(value="/do_login", method= RequestMethod.POST)
public String doLogin(
@RequestParam("username") String username,
@RequestParam("password") String password,
@RequestParam("code") String code){
 
可以设置:required=false,表示参数是可选的,可以传递也可以不传递。默认值是true,必须传递
@RequestParam(name = "code", required = false) String code
 
4、配置参数的默认值
defaultValue属性可以配置参数的默认值,当参数没有被定义时,使用默认值
@RequestMapping(value="/do_login", method= RequestMethod.POST)
public String doLogin(
@RequestParam("username") String username,
@RequestParam("password") String password,
/*@RequestParam(name = "code", required = false) String code*/
@RequestParam(name = "code", defaultValue = "") String code){
System.out.println(username);
System.out.println(password);
System.out.println("code = " + code);
return "success";
}
 
5、接收参数时,数值类型的参数应该使用包装类类型
否则当前端的字段可以为空时,会报告类型转换错误(400错误)
例如:login.jsp中添加如下字段
<p><label for="number">数值</label><input type="number" name="number" id="number"></p>
LoginController.jsp中接收参数是int,测试:当不输入number的时候会发生400错误
@RequestMapping(value="/do_login", method= RequestMethod.POST)
public String doLogin(
@RequestParam("username") String username,
@RequestParam("password") String password,
/*@RequestParam(name = "code", required = false) String code*/
@RequestParam(name = "code", defaultValue = "") String code,
int number){
System.out.println(username);
System.out.println(password);
System.out.println("code = " + code);
System.out.println("number = " + number);
return "success";
}
控制台警告:
警告: Failed to bind request element: org.springframework.beans.TypeMismatchException: Failed to convert value of type ‘java.lang.String‘ to required type ‘int‘; nested exception is java.lang.NumberFormatException: For input string: ""
 
将 int 该成 Integer 会解决这个问题
Integer number
 

四、@PathVariable 路径传参

通常url中的参数使用queryString,也可以使用路径传参
(1)修改school/list.jsp
<h1>XXX</h1>

<table>
<thead>
<tr>
<th>XXX</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="view?id=1">XXX</a></td>
</tr>
<tr>
<td><a href="view/1">XXX</a></td>
</tr>
</tbody>
</table>
(2)添加school/view.jsp
<h1>XXX</h1>
<h2>XXX</h2>
(3)修改SchoolController.java
@RequestMapping("/view")
public String view1(@RequestParam("id") Integer id){

System.out.println("id = " + id);
return "school/view";
}

@RequestMapping("/view/{id}")
public String view2(@PathVariable("id") Integer id){

System.out.println("id = " + id);
return "school/view";
}
 

五、转发和重定向

重定向
@RequestMapping(value="/do_login", method= RequestMethod.POST)
public String doLogin(......){
......
//return "success";
return "redirect:index";
}
 

六、乱码


1、解决post乱码问题
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>
<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>
 
2、get乱码问题
get 乱码 和 tomcat 版本有关
tomcat7和7以下 需要 解决乱码问题
tomcat8不用

SpringMVC常用注解

标签:...   ping   map   get   控件   login   package   character   container   

原文地址:https://www.cnblogs.com/ggs1213/p/9345770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!