Spring MVC作为Spring框架的一个组件,内容并不多,有Servlet的基础,理解MVC框架时会比较轻松
MVC框架处理三件事(以下三件事就构成了SSM):
① Spring MVC 与 Spring整合
② MyBatis与Spring整合
③ MyBatis与Spring MVC整合
Notice:SpringMVC当中有一规范,使用的时候注意,会与我们之前的编码习惯有冲突
Spring MVC是Spring框架中的一个组件
Spring MVC就是一个实现了MVC的框架,功能上与Struts2一样
Spring MVC是一个基于Servlet的实现的MVC框架
在一个MVC框架中处理三件事儿:
① 接收请求 ,获取请求参数
② 调用业务
③ 页面导航
导入Spring MVC框架必然要导入Spring框架
<!-- Spring MVC的核心控制器配置 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- Spring MVC部分的配置,分开时叫spring-mvc.xml
同时也可以统一配置,在applicationContext.xml文件中进行配置 -->
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
</servlet>
<!-- Spring MVC的核心控制器URL配置 -->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!-- 接收的请求的格式,如果所有请求都提交到这个Servlet,可以使用"/" -->
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<!-- Spring MVC配置开始 -->
<!-- Spring MVC的注册处理器 -->
<mvc:annotation-driven/>
<!-- Spring MVC的视图处理器 -->
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- Spring MVC配置结束 -->
@Controller("DemoController")
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("hello")
public String hello(){
System.out.println("DemoController.hello() is called...");
return "index";
}
}
在SpringMVC中使用注解的方式注册Controller
<context:annotation-config/>
<context:component-scan base-package=*"com.zpark.tea_mgr.controller"*/>
URL: http://localhost:8080/mvc01/demo/hello.xhtml
在Spring MVC框架中,获得请求参数的方式有好几种,Controller类的方法的参数也是由Spring容器负责注入的。自动按反射的方式进行注入的。
@RequestMapping("demo01")
public String demo01(String goodsName){
System.out.println("demo01 is ran...");
return "index";
}
public class Goods {
private int goodsId;
private String goodsName;
}
@RequestMapping("demo02")
public String demo02(Goods goods){
System.out.println("demo02 is ran...");
System.out.println("demo02:goods.getGoodsId()="+goods.getGoodsId());
System.out.println("demo02:goods.getGoodsName()="+goods.getGoodsName());
return "index";
}
@RequestMapping("demo03")
public String demo03(HttpServletRequest request){
System.out.println("demo03 is ran...");
System.out.println("demo03:goodsName="+request.getParameter("goodsName"));
System.out.println("demo03:goodsId="+request.getParameter("goodsId"));
return "index";
}
@RequestMapping("demo04")
public String demo04(@RequestParam("goodsName") String name){
System.out.println("demo04 is ran...");
System.out.println("demo04:goodsName="+name);
return "index";
}
@RequestMapping("demo05/{goodsId}/{goodsName}.xhtml")
public String demo05(@PathVariable int goodsId, @PathVariable String goodsName){
System.out.println("demo05 is ran...");
System.out.println("demo05:goodsId="+goodsId);
System.out.println("demo05:goodsName="+goodsName);
return "index";
}
地址 | 结果 |
---|---|
http://localhost:8080/mvc01/demo/demo05/18/小米.xhtml | 三月 29, 2020 8:53:13 上午 org.apache.catalina.core.ApplicationContext log 信息: Initializing Spring FrameworkServlet 'DispatcherServlet' demo05 is ran... demo05:goodsId=18 demo05:goodsName=小米 |
@Controller("DataController")
@RequestMapping("/data")
public class DataController {
@RequestMapping(value={"demo01"}, method={RequestMethod.POST, RequestMethod.GET})
public String demo01(HttpServletRequest request, HttpSession session){
System.out.println("demo01 is ran...");
request.setAttribute("name", "cc");
session.setAttribute("age", 18);
return "index";
}
<body>
This is my JSP page. <br>
年龄:${sessionScope.age }<br>
requestName:${requestScope.name }<br>
sessionName:${sessionScope.name }<br>
appName:${applicationScope.name }<br>
</body>
@RequestMapping("demo02")
public String demo02(Model model){
System.out.println("demo02 is ran...");
model.addAttribute("name", "张三");
return "index";
}
@RequestMapping("demo03")
public String demo03(ModelMap map){
System.out.println("demo03 is ran...");
map.put("name", "李四");
return "index";
}
@RequestMapping("demo04")
public ModelAndView demo04(){
System.out.println("demo04 is ran...");
ModelAndView mav = new ModelAndView();
mav.addObject("name", "老王");
mav.setViewName("index");
return mav;
}
在WEB应用程序开发时,页面跳转有几种方式? 二种
① 服务器转发 ② 客户端重定向
在Spring MVC种导航的两种实现方式:
① 返回字符串(推荐) ② 使用ModelAndView
在Spring MVC种两种导航进行跳转时,前缀不同:
1 转发: forward:
2 重定向: redirect:
@Controller("ForwordController")
@RequestMapping("/forward")
public class ForwordController {
@RequestMapping("demo01")
public ModelAndView demo01(){
System.out.println("demo01 is ran...");
ModelAndView mav = new ModelAndView();
// 如果转发到jsp页面,不用像下面写的这么复杂,因为他是默认方式
// mav.setViewName("forward:/exp.jsp");
mav.setViewName("exp");
return mav;
}
在Spring MVC中默认只有转发到jsp页面。如果要转发到Controller就要加前缀
@RequestMapping("demo02")
public String demo02(){
System.out.println("demo02 is ran...");
return "forward:/forward/demo01.xhtml";
}
Spring MVC的规范是不直接访问jsp页面,所以重定向时就只有Controller、
一般平常的业务,比如:保存订单之后,会以重定向的方式进行订单查询的调用。
@Controller("RedirectController")
@RequestMapping("/redirect")
public class RedirectController {
@RequestMapping("demo01")
public String demo01(@RequestParam("goodsId") int goodsId){
System.out.println("demo01 is ran...");
System.out.println("goodsId:" + goodsId);
return "exp";
}
@RequestMapping("demo02")
public String demo02(Model model){
System.out.println("demo02 is ran...");
model.addAttribute("goodsId", 6);
return "redirect:/redirect/demo01.xhtml";
}
请求之前:http://localhost:9527/mvc01/redirect/demo02.xhtml
请求之后:http://localhost:9527/mvc01/redirect/demo01.xhtml?goodsId=6
在Model种保存的数据会出现在URL地址栏的参数的位置。
SpringMVC中使用json时,不用过多的配置
当一个Controller方法返回一个JSON时,需要用注解**@ResponseBody**
以下演示了返回不同的数据类型的处理
// 返回页面
@RequestMapping("demo01")
public String demo01(){
System.out.println("demo01 ran...");
return "index";
}
// 返回文本
@RequestMapping("demo02")
@ResponseBody
public String demo02(){
System.out.println("demo02 ran...");
return "index";
}
// 返回对象
@RequestMapping("demo03")
@ResponseBody
public Object demo03(){
System.out.println("demo03 ran...");
return false;
}
// 返回自定义对象
@RequestMapping("demo04")
@ResponseBody
public Object demo04(){
System.out.println("demo04 ran...");
Goods goods = new Goods();
goods.setGoodsId(1);
goods.setGoodsName("测试1");
return goods;
}
// 返回集合
@RequestMapping("demo05")
@ResponseBody
public Object demo05(){
System.out.println("demo05 ran...");
List<Goods> goodsList = new ArrayList<Goods>();
Goods goods1 = new Goods();
goods1.setGoodsId(1);
goods1.setGoodsName("测试1");
Goods goods2 = new Goods();
goods2.setGoodsId(2);
goods2.setGoodsName("测试2");
goodsList.add(goods1);
goodsList.add(goods2);
return goodsList;
}
// 返回Map
@RequestMapping("demo06")
@ResponseBody
public Object demo06(){
System.out.println("demo06 ran...");
Map<String, Object> map = new HashMap<String, Object>();
List<Goods> goodsList = new ArrayList<Goods>();
Goods goods1 = new Goods();
goods1.setGoodsId(1);
goods1.setGoodsName("测试1");
Goods goods2 = new Goods();
goods2.setGoodsId(2);
goods2.setGoodsName("测试2");
goodsList.add(goods1);
goodsList.add(goods2);
map.put("goodsList", goodsList);
map.put("name", "Albert");
map.put("age", 18);
return map;
}
以下是jQuery以及Ajax的一些示范性代码
<h1 id="title1">点我</h1>
<div id="index_div01"></div>
<script type="text/javascript">
$(function(){
$("#title1").click(function(){
$.ajax({
url:"${pageContext.request.contextPath}/Json/demo06.do",
type:"POST",
dataType:"json",
success:function(data){
for(var key in data){
$("#index_div01").css({"color":"red","font-size":"28px"});
if(key == "goodsList"){
$("#index_div01").append("goodsList Info:<br>");
// 遍历集合
for(var i=0; i<data[key].length; i++){
$("#index_div01").append(" ").append(data[key][i].goodsId).append(":").append(data[key][i].goodsName).append(";<br>");
}
}else{
$("#index_div01").append(key+":").append(data[key] + "<br>");
}
}
}
});
});
});
</script>
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date goodsDate;
@DateTimeFormat注解可以将字符串格式的日期进行Date类型的转换
<form action="${pageContext.request.contextPath }/date/demo01.do" method="post">
商品名称:<input name="goodsName"><br>
商品日期:<input name="goodsDate"><br>
<input type="hidden" name="goodsId" value="1"><br>
<input type="submit" value="提交">
</form>
在applicationContext.xml文件中,找到mvc:annotation-diver/,将他打开,在他下面添加如下的代码
<!-- 处理responseBody 里面日期类型 -->
<mvc:message-converters>
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd" />
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date goodsDate;
评论