spring-mvc值传递

在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&lt;String&gt;</a><br/>
${requestScope.stringList }
</p>
<p>
<h3>List</h3>
<a href="index.do?type=list_user">返回List&lt;User&gt;</a><br/>
${requestScope.userList }
</p>
<p>
<h3>Set</h3>
<a href="index.do?type=set_user">返回Set&lt;User&gt;</a><br/>
${requestScope.userSet }
</p>
<p>
<h3>User(Object)</h3>
<a href="index.do?type=user">返回User(Object)</a><br/>
${requestScope.user }
</p>

 

猜你喜欢

转载自ezbcw.iteye.com/blog/2196955