原创

springMVC

1、Spring MVC 概述

  • 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框架中处理三件事儿:

    ① 接收请求 ,获取请求参数

    ② 调用业务

    ③ 页面导航

2、Spring MVC的核心组件

  • DispatcherServlet:Spring MVC提供的一个核心控制器,所有请求都发送到这个Servlet上,有这个Servlet进行请求分发,规范中要求请求一个jsp资源时,也要求大家都提交到该Servlet
  • HandlerMapping:映射器,DispatcherServlet分发到不同的Controller中,根据HaddlerMapping映射进行的分发,这个类我们不用去管。
  • Controller:控制器。这个是我们在开发时要编写的核心组件 A 接收请求,获得请求参数 B 调用后台业务 C 保存数据进行页面导航
  • ModelAndView:模型视图组件。Model是一个模型对象,保存,传递数据。View是一个视图对象,进行页面导航。这个类Spring已经提供好了,我们使用即可。
  • ViewResolver:视图解析器。进行页面导航时的路径处理。这个在Spring MVC的配置文件中进行配置就好了。
  • View:视图, .jsp页面

3、Spring MVC的案例

3.1 创建WEB工程

3.2 导入SpringMVC框架

​ 导入Spring MVC框架必然要导入Spring框架

3.3 在Web.xml文件中进行关于核心控制器的配置

<!-- 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>

3.4 在Spring MVC配置文件中配置MVC的信息

<!-- 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配置结束 -->

3.5 编写Controller

@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"*/>

3.6 访问

URL: http://localhost:8080/mvc01/demo/hello.xhtml

4、获得请求的参数

​ 在Spring MVC框架中,获得请求参数的方式有好几种,Controller类的方法的参数也是由Spring容器负责注入的。自动按反射的方式进行注入的。

4.1 直接使用方法参数

@RequestMapping("demo01")
	public String demo01(String goodsName){
		System.out.println("demo01 is ran...");
		return "index";
}

4.2 使用对象来接收方法参数

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";
	}

4.3 直接使用ServletAPI

@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";
}

4.4 当请求参数的名称与方法名称的参数不一致

@RequestMapping("demo04")
	public String demo04(@RequestParam("goodsName") String name){
		System.out.println("demo04 is ran...");
		System.out.println("demo04:goodsName="+name);
		return "index";
}

4.5 直接从URL地址上获取请求参数

@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=小米

5、进行数据传递

5.1 直接使用Servlet API

@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>

5.2 使用Spring MVC框架的Model接口

@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;
	}

6、页面导航

在WEB应用程序开发时,页面跳转有几种方式? 二种

① 服务器转发 ② 客户端重定向

在Spring MVC种导航的两种实现方式:

① 返回字符串(推荐) ② 使用ModelAndView

在Spring MVC种两种导航进行跳转时,前缀不同:

1 转发: forward:

2 重定向: redirect:

6.1 使用ModelAndView实现转发到jsp页面

@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;
}

6.2 使用String类型转发到Controller

在Spring MVC中默认只有转发到jsp页面。如果要转发到Controller就要加前缀

@RequestMapping("demo02")
	public String demo02(){
		System.out.println("demo02 is ran...");
		return "forward:/forward/demo01.xhtml";
}

6.3 重定向到Controller

​ Spring MVC的规范是不直接访问jsp页面,所以重定向时就只有Controller、

6.4 在重定向时附加参数

​ 一般平常的业务,比如:保存订单之后,会以重定向的方式进行订单查询的调用。

@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地址栏的参数的位置。

7、 SpringMVC整合JSON的使用

SpringMVC中使用json时,不用过多的配置

7.1 导入json的jar文件

7.2 使用Controller返回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("&nbsp;&nbsp;").append(data[key][i].goodsId).append(":").append(data[key][i].goodsName).append(";<br>");
								}
							}else{
								$("#index_div01").append(key+":").append(data[key] + "<br>");
							}
						}
					}
				});
			});
		});
</script>

8、关于日期的处理

8.1 在请求中有日期类型时

@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>

8.2 JSON中日期类型的处理

8.2.1 统一通过配置方式进行处理

在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>

8.2.2 使用注解设置格式

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date goodsDate;
  • 作者:管理员(联系作者)
  • 发表时间:2020-04-22 04:07
  • 版权声明:自由转载-非商用-非衍生-保持署名
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论

    沐鱼 游客
    真好看
    H H QQ
    dds