一、基本概念
控制器(controller):服务端请求处理与页面响应组件,通过 @RequestMapping参数,响应URI路径访问请求;
模型(model):从服务端返回客户端的数据,在客户端可操作处理的数据对象;
视图(View):客户端页面,一般为*.jsp 文件;
二、Java Sprng MVC 程序处理流程
三、在控制器中访问request、response对象
@Controller
public class OtherExampleController {
@RequestMapping("/somePath")
public String requestResponseExample(HttpServletRequest request,
HttpServletResponse reponses, Model model) {
// Todo something here
return "someView";
}
}
通过HttpServletRequest、HttpServletResponse直接访问http请求内容,需要在响应的路径响应方法中添加@ResponseBody,以直接返回response内容
备注:采用@ResponseBody声明直接通过response数据后,后者通过response写入到输出流,或者通过return 返回数据,不能通过既直接写入又return返回,因return的内容实际也是写入到response输出流中的
四、重定向
可通过向模型返回 “redirect:/path”的方法进行控制器重定向,重定向时向上一页面返回的模型值将作为下一路径的request参数进行传递,url如示例:http://localhost:8080/test/hello1?greeting=Hello+Spring+MVC+first+testnull 其中greeting本是控制器向视图返回的模型数据;代码示例如下:
@Controller
public class HelloWorldController {
@RequestMapping("/hello")
public String hello(HttpServletRequest request, HttpServletResponse response, Model model) {
String reParameter= request.getParameter("test");
model.addAttribute("greeting", "Hello Spring MVC first test"+reParameter);
return "redirect:/hello1";
}
@RequestMapping("/hello1")
public String hello1(HttpServletRequest request, HttpServletResponse response, Model model) {
String reParameter= request.getParameter("greeting");
model.addAttribute("greeting", "this is redirsct pages"+reParameter);
return "helloworld";
}
}
四、控制器与视图的数据交互
1、控制器与视图之间可通过模型进行数据交互,模型可划分为在路径访问函数中返回的数据以及直接向页面返回的数据,模型数据均采用现模型添加:对象名称和对象值这样的键值对来交互,页面中直接按照对象名称即可获得模型中的数据实例。代码示例:
<!--对象被添加到模型,访问名称为countries-->
@ModelAttribute("countries")
public List<String> initializeCountries() {
List<String> countries = new ArrayList<String>();
countries.add("USA");
countries.add("CHINA");
countries.add("FRANCE");
countries.add("GERMANY");
countries.add("ITALY");
countries.add("OTHER");
return countries;
}
在页面中可直接通过 名称访问模型对象
<div class="row">
<div class="form-group col-md-12">
<label class="col-md-3 control-lable" for="country">Country</label>
<div class="col-md-7">
<form:select path="country" id="country" class="form-control input-sm">
<form:option value="">Select Country</form:option>
<form:options items="${countries}" />
</form:select>
<div class="has-error">
<form:errors path="country" class="help-inline"/>
</div>
</div>
</div>
</div>
四、视图返回
通过 控制器返回的视图,可以是jsp页面,也可以是rss订阅返回数据,以及从服务端返回的json或xml数据;
1、rss订阅返回的实现:
1)spring-mvc.xml配置文件修改
<context:component-scan base-package="com.yiibai.springmvc" />
<!-- 替代了返回jsp页面视图配置-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<bean id="rssViewer" class="com.yiibai.springmvc.RSSFeedViewer" />
2)实现视图bean
public class RSSFeedViewer extends AbstractRssFeedView {
@Override
protected void buildFeedMetadata(Map<String, Object> model, Channel feed,
HttpServletRequest request) {
feed.setTitle("YiibaiPoint Dot Com");
feed.setDescription("Java Yiibai and Examples");
feed.setLink("http://www.yiibai.com");
super.buildFeedMetadata(model, feed, request);
}
@Override
protected List<Item> buildFeedItems(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) throws Exception {
List<RSSMessage> listContent = (List<RSSMessage>) model.get("feedContent");
List<Item> items = new ArrayList<Item>(listContent.size());
for(RSSMessage tempContent : listContent ){
Item item = new Item();
Content content = new Content();
content.setValue(tempContent.getSummary());
item.setContent(content);
item.setTitle(tempContent.getTitle());
item.setLink(tempContent.getUrl());
item.setPubDate(tempContent.getCreatedDate());
items.add(item);
}
return items;
}
}
3)控制器返回rss订阅内容
@RequestMapping(value="/rssfeed", method = RequestMethod.GET)
public ModelAndView getFeedInRss() {
List<RSSMessage> items = new ArrayList<RSSMessage>();
RSSMessage content = new RSSMessage();
content.setTitle("Spring教程");
content.setUrl("http://www.yiibai/spring");
content.setSummary("Spring tutorial summary...");
content.setCreatedDate(new Date());
items.add(content);
RSSMessage content2 = new RSSMessage();
content2.setTitle("Spring MVC教程");
content2.setUrl("http://www.yiibai/spring_mvc");
content2.setSummary("Spring MVC tutorial summary...");
content2.setCreatedDate(new Date());
items.add(content2);
ModelAndView mav = new ModelAndView();
mav.setViewName("rssViewer");
mav.addObject("feedContent", items);
return mav;
}
2、spring-mv返回xml数据
1)、修改spring-mvc配置文件
<context:component-scan base-package="com.yiibai.springmvc" />
<mvc:annotation-driven />
2)、控制器直接返回可序列化为xml的对象
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value="{name}", method = RequestMethod.GET)
public @ResponseBody User getUser(@PathVariable String name) {
//===========User为可序列化为xml的对象====
User user = new User();
user.setName(name);
user.setId(1);
return user;
}
}
关于spring-mvc如何使用映射器,实现Spring MVC简单URL处理程序映射以及Spring MVC多动作控制器
参见地址:http://www.yiibai.com/spring_mvc/springmvc_simpleurlhandlermapping.html