心得:我第一个接触的java web框架是Struts,当时学的真的是很心酸,没人指导我应该怎么学,只有通过视屏和看别的写得代码来学习,Struts1(当时不了解1已经过时)和Struts2一共学习一两个月,最后通过一个学生管理系统算是真正的弄懂了。当我Hibernate快学完的时候,我了解的SSH框架已经有淘汰的趋势,SSM不出意外会成为主流。当时我是懵逼的,作为菜鸟的我以为SSH学完就算是圆满了,就可以开始弄东西了。没办法只有开始继续学习。因为Struts和Hibernate我学了很久的时间的,我以为学SSM要花很长时间,没想到的是居然只花了半个月三个框架的整合就基本上能熟练运用了,可见Spring这个框架做的真的是简单易用,也可能是以前的基础打的比较好,所以最后得出的结论不要一味的迷信框架,基础和业务逻辑才是真正的核心。
好了开始正文。
1、Spring MVC 是什么
Spring Web MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级 Web 框架,即使用了 MVC 架 构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开 发,Spring Web MVC 也是要简化我们日常 Web 开发的。
另外还有一种基于组件的、事件驱动的 Web 框架在此就不介绍了,如 Tapestry、JSF 等。
Spring Web MVC 也是服务到工作者模式的实现,但进行可优化。前端控制器是 DispatcherServlet;应用控制器其 实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/ 处理器为 Controller 接口(仅包含 ModelAndView handleRequest(request, response) 方法)的实现(也可以 是任何的 POJO 类) ;支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、 格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持
2、Spring MVC 能帮我们做什么
√让我们能非常简单的设计出干净的 Web 层和薄薄的 Web 层;
√进行更简洁的 Web 层的开发; √天生与 Spring 框架集成(如 IoC 容器、AOP 等) ;
√提供强大的约定大于配置的契约式编程支持; √能简单的进行 Web 层的单元测试;
√支持灵活的 URL 到页面控制器的映射;
√非常容易与其他视图技术集成,如 Velocity、FreeMarker 等等,因为模型数据不放在特定的 API 里,而是放在一个 Model 里(Map 数据结构实现,因此很容易被其他框架使用);
√非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的 API;
√提供一套强大的 JSP 标签库,简化 JSP 开发;
√支持灵活的本地化、主题等解析;
√更加简单的异常处理;
√对静态资源的支持;
√支持 Restful 风格。
3、Spring MVC 的实现
1)在web.xml中添加Spring MVC的支持
springMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
true
springMVC
*.do
这样,所有的.do的请求,都会被SpringMVC Servlet处理;
2)新建spring-mvc.xml文件
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
@RequestMapping("/index")
public String index() {
return "index";
}
}
@Controller:用于标识是处理器类;
@RequestMapping:请求到处理器功能方法的映射规则,标记一个访问的路径(/index.jsp),return "index"标记返回视图(index.jsp);
注:如果@RequestMapping注解在类级别上,则表示一相对路径,在方法级别上,则标记访问的路径;
4)Spring MVC 支持RESTful风格的URL参数
@Controller
public class IndexController {
@RequestMapping("/index/{username}")
public String index(@PathVariable("username") String username) {
System.out.print(username);
return "index";
}
}
5)根据不同的Web请求方法,映射到不同的处理方法(这个是我为了写博客找资料的时候菜知道有这个功能,但是感觉用处不是很大)
@Controller
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.GET) //如果get请求映射到这个方法,结果返回到login.jsp
public String login() {
return "login";
}
@RequestMapping(value = "/login", method = RequestMethod.POST) //如果前台是post请求,则映射到这个方法,结果返回到login2.jsp
public String login2(HttpServletRequest request) {
String username = request.getParameter("username").trim();
System.out.println(username);
return "login2";
}
}
return "redirect:/login2"
6)http正文的响应, @responsebody
@RequestMapping("/item/{itemId}")
@ResponseBody
public TbItem getItemById(@PathVariable Long itemId) {
TbItem tbItem = itemService.getItemById(itemId);
return tbItem;
}
一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。
7)SpringMVC中Controller中方法的返回值
void:多数用于使用PrintWriter输出响应数据,作为前台AJAX验证之后,用PrintWriter为前台返回JSON数据;
String 类型:返回该String对应跳转的界面;
ModelAndView:一般用于在你在做界面跳转的时候需要带一点数据
@RequestMapping("/userinf-{username}")
public ModelAndView test(@PathVariable("username") String username) throws Exception{
ModelAndView mav = new ModelAndView();
mav.addObject("username", username); //向界面传递username的值
mav.setViewName("userinf"); //传入一个String类型的值,然后跳转到这个值所对应的JSP界面
return mav;
}