在controller中有两种方式,获取前台页面传来的参数
页面表单:
<form action="user.do" method="post"> 用户名:<input type="text" name="name"/><br/> 年龄:<input type="text" name="age"/><br/> 生日:<input type="text" name="birth"/><br/> <input type="submit" value="添加"/> </form
第一种
/** * 1、直接使用形参获取前台传递的参数 * 要注意的是形参的名字必须和页面参数的名字一致 * @param model * @param name * @param age * @param birth * @return */ @RequestMapping(method=RequestMethod.POST) public String registerUser(Model model,String name,Integer age,Date birth){ model.addAttribute("message", "注册一个用户"); System.out.println("name:"+name + "age:"+age+"birth:"+birth); System.out.println("UserController.registerUser()"); return "/WEB-INF/account/userDetail.jsp"; }
第二种
/** * 2、使用对象接受前台传递的参数 * 要注意的是前台传递的参数的名称必须和对象的属性名称一直,如果不一致则可以使用@ModelAttribute("u")String uname指定 */ @RequestMapping(method=RequestMethod.POST) public String registerUser(Model model,User user){ model.addAttribute("message", "注册一个用户"); System.out.println("name:"+user.getName() + "age:"+user.getAge()+"birth:"+user.getBirth()); System.out.println("UserController.registerUser()"); return "/WEB-INF/account/userDetail.jsp"; }
SpringMVC不支持List参数,可以先绑定json数据,然后再把json转成List。
SpringMVC不支持Date参数类型转换,需要在DTO上加如下注解
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date publishBegin;
List<String> attributeValues = JSON.parseArray(searchDTO.getFilterQuery(), String.class);
action的@Controller的@RequestMapping不写,那么直接去找方法的@RequestMapping,但是方法的@RequestMapping不能为空
controller中获取web元素
当某个方法需要使用web对象时(request,response,session,application)可以使用如下方式:
除了application,其他的对象都可以直接设为方法的形参。spring会自动将对应的对象传递给对应的形参。
而application对象可以使用session对象获取。
当然也可以在方法中使用response对象重定向到其他的url,这时方法最后return的url则可以视作无效。
同样的也可以使用request对象转发到其他的url。
@RequestMapping(value="/web.do") public String getWebElement(HttpServletRequest request,HttpServletResponse response,HttpSession session) throws IOException, ServletException{ System.out.println("request:"+request.getParameter("pname")); request.setAttribute("message", "requestData"); session.setAttribute("message", "sessionData"); session.getServletContext().setAttribute("message", "applicationData"); //response.sendRedirect("http://localhost:8080/tiger/account/user.do?method=add"); //return null; //request.getRequestDispatcher("/WEB-INF/account/userDetail.jsp").forward(request, response); return "/WEB-INF/account/userDetail.jsp"; }
将controller中数据传递到jsp页面
1、可以在controller中获取request对象,然后将数据设置为request对象的属性,然后使用转发的方式进入jsp即可。
2、将方法的返回值改为ModelAndView,将数据存储在ModelAndView对象中:
new ModelAndView("/WEB-INF/account/userDetail.jsp","message",message)
其中第一个参数为url,第二个参数为要传递的数据的key,第三个参数为数据对象。
要注意的是:数据默认被存放在request中。
//使用modelAndView对象将数据传递到前台。 @RequestMapping(value="/mad/showData_1.do") public ModelAndView showData_1(){ String message = "这个是要传递的数据"; //其中第一个参数为url,第二个参数为要传递的数据的key,第三个参数为数据对象。 //在这里要注意的是 数据是默认被存放在request中的。 return new ModelAndView("/WEB-INF/account/userDetail.jsp","message",message); }
前台页面获取方式:
request:${requestScope.message}
可以在类的前面添加注解@SessionAttributes({"message","user"})
这个注解可以设置对应的model中参数也会在session中存储一份。该注解中的参数为一个集合,可以写多个,如上面的例子,其中message和user都是存储的数据的key.
示例程序:
@SessionAttributes({"message","user"}) //modelAndView中的对应的数据也会在session中存储一份
页面获取:
session:${sessionScope.message}
数据modelAndView返回一个集合
该处理方式和上面的处理方式一致,因为modelAndView接受的数据类型是Object的,集合也是一样的处理方式
//使用modelAndView对象将数据传递到前台。 //传递多个参数(不同类型的) @RequestMapping(value="/mad/showData_2.do") public ModelAndView showData_2(){ String message = "这个是要传递的数据"; UserDTO user = new UserDTO("张三", 12, new Date()); List<User> us= new ArrayList<User>(); us.add(new User("张三", 12, new Date())); us.add(new User("张四", 13, new Date())); us.add(new User("张五", 14, new Date())); ModelAndView mav = new ModelAndView("/WEB-INF/jsp/showData.jsp"); //将数据存入modelMap mav.addObject("message", message); mav.addObject(user);//默认为类名的首字母小写 mav.addObject("users", us); return mav; }
前台页面获取方式:
request:${requestScope.message }<br/>
<c:forEach items="${requestScope.users }" var="u">
${u.name }-${u.age }-${u.birth }<br/>
</c:forEach>
可以通过ModelAndView的mav.addObject("message", message);方法设置参数。
该方法中第一个参数为数据的key,第二个参数为数据对象。
也可以使用mad.addObject(user);方法
该方法中数据的参数为数据对象,数据的key为该对象的类的类名(其中首字母小写)。
当然也可以使用ModelMap传递多个数据到jsp中。
设置跳转方式为重定向或者转发
1、spring默认的跳转方式即为转发,当然转发也可以写作:return "forward:/WEB-INF/account/userDetail.jsp";
2、重定向必须写作:return "redirect:http://localhost:8080/tiger/account/user.do?method=userDetail&id=1";
视图解析器的配置和使用
1、在spring-servlet.xml中配置视图解析器
<!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 视图后缀,controller中的方法返回的url字符串会添加该后缀 --> <property name="suffix" value=".jsp"/> <!-- 视图前缀,controller中的方法返回的url字符串会添加该前缀 --> <property name="prefix" value="/WEB-INF/account/"/> </bean>
配置该解析器之后,那么controller中的返回的视图url就会被改写
如:return "userDetail"; 实际跳转的url为:/WEB-INF/account/userDetail.jsp
controller中方法的返回值类型
返回值除了可以返回String和ModelAndView外还有其他类型。
其他类型还包括:void、ModelMap、Map、Object、map、List、Set。一般建议使用String。
1、返回值类型为void 则只是纯粹的执行了方法中的程序,然后响应的url依然为请求的url
例如案例中请求为index.do 则响应的url为 index 在视图解析器解析之后得到的最终的url为/WEB-INF/account/index.jsp
示例:
//返回值为void @RequestMapping(value="/index.do",params="type=void") public void resultVoid(HttpServletRequest request){ request.setAttribute("void", "resultVoid"); }
2、返回值为modelMap时,响应的url和void一致。
只是存储在MpdelMap中的数据可以在jsp页面中取出。
示例:
//返回值为ModelMap @RequestMapping(value="index.do",params="type=modelMap") public ModelMap resultModelMap(ModelMap map){ map.put("msg", "这里是modleMap中的数据"); return map; }
3、返回值为Map时,和modelMap几乎完全一致。
//返回值为Map @RequestMapping(value="index.do",params="type=map") public Map resultMap(){ Map<String,String> map = new HashMap<String,String>(); map.put("msg", "这里是Map中的数据"); return map; }
4、返回值为List时,响应的url和void一致。
spring会将list对象存储在request中,而该对象的存储的key为:当list中存储为String类型数据时key为:stringList。当存储为User对象时 key为:userList。其他的类型的可以类比。
//返回值为List<String> @RequestMapping(value="index.do",params="type=list_string") public List resultList_String(){ List ls = new ArrayList(); ls.add("list1");ls.add("list2");ls.add("list3"); return ls; } //返回值为List<User> @RequestMapping(value="index.do",params="type=list_user") public List<User> resultList_User(){ List<User> ls = new ArrayList<User>(); ls.add(new User("张三")); ls.add(new User("张四")); return ls; }
5、返回值为Set时,和List除了没有顺序之外,其他都一致。
//返回值为Set<User> @RequestMapping(value="index.do",params="type=set_user") public Set<User> resultSet_User(){ Set<User> ls = new HashSet<User>(); ls.add(new User("张三")); ls.add(new User("张四")); return ls; }
6、返回值为Object时,响应的url和以上一致,spring也会将返回的对象存储在request中,该对象在request中的key为该对象类型的类名(首字母小写)
//返回值为User @RequestMapping(value="index.do",params="type=user") public User resultUser(){ return new User("张四"); }
所有的返回值类型页面获取方式为:
<h1>返回值类型</h1> <p> <h3>Void</h3> <a href="index.do?type=void">无返回值类型</a><br/> ${requestScope.void } </p> <p> <h3>ModelMap</h3> <a href="index.do?type=modelMap">返回ModelMap</a><br/> ${requestScope.msg } </p> <p> <h3>Map</h3> <a href="index.do?type=map">返回map</a><br/> ${requestScope.msg } </p> <p> <h3>List</h3> <a href="index.do?type=list_string">返回List<String></a><br/> ${requestScope.stringList } </p> <p> <h3>List</h3> <a href="index.do?type=list_user">返回List<User></a><br/> ${requestScope.userList } </p> <p> <h3>Set</h3> <a href="index.do?type=set_user">返回Set<User></a><br/> ${requestScope.userSet } </p> <p> <h3>User(Object)</h3> <a href="index.do?type=user">返回User(Object)</a><br/> ${requestScope.user } </p>