一、基本操作
1.响应请求的方式
1.1ModelAndView
/** * 查询方法 * @return */ @RequestMapping("/query") public ModelAndView query(){ System.out.println("波波烤鸭:query"); ModelAndView mv = new ModelAndView(); mv.setViewName("/index.jsp"); return mv; }
1.2返回void
返回值为void时,方法中可以不用做任何返回,例如下面代码:
@RequestMapping("/test1") public void test1() { System.out.println("test1"); }
此时,在浏览器端请求/test1接口,springmvc会默认去查找和方法同名的页面作为方法的视图返回。 如果确实不需要该方法返回页面,可以使用@ResponseBody注解,表示一个请求到此为止。
@RequestMapping("/test1") @ResponseBody public void test1() { System.out.println("test1"); }
1.3返回一个字符串
返回一个真正的字符串
/** * 返回一个字符串 * @return */ @RequestMapping("/hello") @ResponseBody public String hello(){ return "hello"; }
返回一个跳转页面名称
/** * 返回一个字符串 * @return */ @RequestMapping("/hi") public String hello(){ return "/index.jsp"; }
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 开启注解 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 开启扫描 --> <context:component-scan base-package="com.dpb.controller"></context:component-scan> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置响应地址的前后缀 --> <property name="prefix" value="/user"/> <property name="suffix" value=".jsp"/> </bean> </beans>
响应的代码:
/** * 返回一个字符串 * @return */ @RequestMapping("/hello") public String hello1(){ // 视图解析器解析的时候会自动拼接上 /user 和 .jsp return "/hello"; }
/** * 返回一个字符串 * @return */ @RequestMapping("/delete") public String delete(){ System.out.println("波波烤鸭:删除数据操作...."); // 重定向 return "redirect:/user/query"; } /** * * @return */ @RequestMapping("/query") public String query(){ System.out.println("波波烤鸭:query"); return "/hello"; }
返回路径注意: 返回的字符带"/“表示从根目录下开始找,不带”/"从当前目录下查找
1.4通过Request和Response对象处理
/** * HttpServletRequest和HttpServletResponse的使用 * @return * @throws IOException */ @RequestMapping("/query") public void query(HttpServletRequest request,HttpServletResponse response) throws IOException{ System.out.println("波波烤鸭:query"); System.out.println(request); System.out.println(response); response.sendRedirect(request.getContextPath()+"/user/hello.jsp"); }
1.5 @RequestMapping的说明
映射路径
是个@RequestMapping最基本的功能,用法:
@RequestMapping("/delete") public String delete(){ System.out.println("波波烤鸭:删除数据操作...."); return "/hello"; }
窄化请求
窄化请求用来限定请求路径,即将@RequestMapping放在类上,这样,方法的请求路径是类上的@ReqmestMapping+方法上的@RequestMapping
请求方法限定
2.参数绑定
2.1基本数据类型
/** * 接收参数 * 基本数据类型 * @param id * @param name * @return */ @RequestMapping("add") public String add(int id,String name){ System.out.println(id+"---"+name); return "/hello"; }
/** * 接收参数 * 基本数据类型 * 请求参数如果和形参名称不一致可以通过@RequestParam类指定 * @param id * @param name * @return */ @RequestMapping("add") public String add(int id,@RequestParam("username")String name){ System.out.println(id+"---"+name); return "/hello"; }
此时,如果不想传递该参数,需要明确指定,指定方式有两种:
通过required属性指定该参数不是必填的
/** * 接收参数 * 基本数据类型 * 请求参数如果和形参名称不一致可以通过@RequestParam类指定 * @param id * @param name * @return */ @RequestMapping("add") public String add(int id ,@RequestParam(value="username",required=false)String name){ System.out.println(id+"---"+name); return "/hello"; }
2. 通过defaultValue属性给该参数指定一个默认值
/** * 接收参数 * 基本数据类型 * 请求参数如果和形参名称不一致可以通过@RequestParam类指定 * @param id * @param name * @return */ @RequestMapping("add") public String add(int id ,@RequestParam(value="username",defaultValue="kaoya")String name){ System.out.println(id+"---"+name); return "/hello"; }
2.2对象
2.2.1简单对象
1.创建Book对象
public class Book { private int id; private String name; private String author; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } }
2.设置形参为Book对象接收数据
@Controller public class BookController { /** * 是@RequestMapping(value = "/doReg",method = RequestMethod.POST)的简写, * 但是@PostMaping只能出现在方法上,不能出现在类上 * @param book * @return */ //@RequestMapping("/add") @PostMapping("/add") public String add(Book book){ System.out.println(book); return "/index.jsp"; } }
3.表单传递数据
<form action="/add" method="post"> <table> <tr> <td>编号</td> <td><input type="text" name="id"></td> </tr> <tr> <td>书名</td> <td><input type="text" name="name"></td> </tr> <tr> <td>作者</td> <td><input type="text" name="author"></td> </tr> <tr> <td><input type="submit" value="添加"></td> </tr> </table> </form>
2.2.2包装对象
1.book对象包含Author对象
2.表单提交数据
<form action="add" method="post"> <table> <tr> <td>编号</td> <td><input type="text" name="id"></td> </tr> <tr> <td>书名</td> <td><input type="text" name="name"></td> </tr> <tr> <td>作者年龄</td> <td><input type="text" name="author.age"></td> </tr> <tr> <td>作者姓名</td> <td><input type="text" name="author.name"></td> </tr> <tr> <td>作者性别</td> <td><input type="text" name="author.sex"></td> </tr> <tr> <td><input type="submit" value="添加"></td> </tr> </table> </form>
3.结果
2.3数组集合类型
数组
表单中直接传递多个参数:
<form action="user/doReg" method="post"> <table> <tr> <td>用户名</td> <td><input type="text" name="username"></td> </tr> <tr> <td>用户密码</td> <td><input type="password" name="password"></td> </tr> <tr> <td>兴趣爱好</td> <td><input type="checkbox" name="favorites" value="zuqiu">足球 <input type="checkbox" name="favorites" value="lanqiu">篮球 <input type="checkbox" name="favorites" value="pingpang">乒乓球</td> </tr> <tr> <td><input type="submit" value="注册"></td> </tr> </table> </form>
@RequestMapping("/doReg") public String doReg(String username ,String password,String[] favorites){ System.out.println(username+"---"+password); for (String f : favorites) { System.out.println(f); } return "/index.jsp"; }
2.集合
除了自定义参数类型转换,如果想要使用集合去接收参数,也可以将集合放到一个包装类中。
public class User { private String username; private String password; private List<String> favorites; @Override public String toString() { return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", favorites=" + favorites + '}'; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public List<String> getFavorites() { return favorites; } public void setFavorites(List<String> favorites) { this.favorites = favorites; } }
这样,集合中也能收到传递来的参数。
2.4Date类型
接收数据类型是Date类型的需要通过转换器进行接收
@RequestMapping("/update") public String update(Date d){ System.out.println(d); return "/index.jsp"; }
如果不转换直接访问提交会爆400错误
创建自定义的转换器
/** * 自定义转换器 * * @author dpb【波波烤鸭】 * */ public class DateConvert implements Converter<String,Date>{ @Override public Date convert(String msg) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { return sdf.parse(msg); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
配置转换器
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 开启注解 --> <mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"></mvc:annotation-driven> <!-- 开启扫描 --> <context:component-scan base-package="com.dpb.controller"></context:component-scan> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置响应地址的前后缀 <property name="prefix" value="/user"/> <property name="suffix" value=".jsp"/>--> </bean> <!-- 配置转换器 --> <bean id="formattingConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.dpb.convert.DateConvert"/> </set> </property> </bean> </beans>
3.响应数据
3.1ModelAndView
3.2HttpServletRequest
3.3HttpSession
3.4Map
@RequestMapping("/query1") public String query1(Map<String,Object> map){ map.put("msg", "map --> value"); return "/index.jsp"; }
3.5Model
@RequestMapping("/query2") public String query2(Model model){ model.addAttribute("msg", "model --> value"); return "/index.jsp"; }
3.6ModelMap
@RequestMapping("/query3") public String query3(ModelMap mm){ mm.addAttribute("msg", "modelMap --> value"); return "/index.jsp"; }
注意:@SessionAttributes将数据保存在session作用域中,上面几个传值都是request作用域
4.post方式中文乱码问题处理
在web.xml文件中添加如下代码即可
<!-- spring框架提供的字符集过滤器 --> <!-- spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解决POST方式造成的中文乱码问题 --> <filter> <filter-name>encodingFilter</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>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>