Web开发表现层主要请求和响应

响应包括两方面
1,页面跳转
2,数据共享
页面跳转两种方式
1,请求转发
2,重定向

web.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">

	<!-- 设置请求参数字符编码过滤 -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>	
	
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>\/*</url-pattern>
	</filter-mapping>


	<!-- 配置SpringMVC的前端控制器 (总控)
		之前所有请求,都访问Servlet
		现在:所有请求都要经过SpringMVC
	
	-->
	
	<servlet>
		<servlet-name>MVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		
		<!-- 初始化参数读取springmvc.xml配置文件 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		
		<!-- 容器初始化启动时机,tomacat服务器启动就启动 -->
		<load-on-startup>1</load-on-startup>
		
	</servlet>
	
	<servlet-mapping>
		<servlet-name>MVC</servlet-name>
		<!-- 
			使用 通配符*+后缀
			如 : *.do(推荐),*.action *.mvc
		 -->
		
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

</web-app>
springMVC.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	
	
	<!-- 配置Spring注解配置包扫描  -->
	<context:component-scan base-package="com.ywq.springmvc"/>
	
	<!-- 配置SpringMVC的注解驱动 -->
	<mvc:annotation-driven/>
	
	<!-- 处理静态资源,将静态资源处理交给Tomcat -->
	<mvc:default-servlet-handler/>
	
	<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/view/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
	
</beans>
1.返回void类型和共享数据 : 需要共享数据,页面跳转
//返回void类型和共享数据 : 需要共享数据,页面跳转
	//必须注入请求响应对象(共享数据,页面跳转)
	@RequestMapping("/method1")
	public void method1(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
		//共享数据
		req.setAttribute("username", "小龙女");
		//跳转到jsp页面要显示数据,就必须使用请求转发
		req.getRequestDispatcher("/WEB-INF/response/response.jsp").forward(req, resp);
	}
2.返回ModelAndView类型和共享数据
/*
 * 	返回ModelAndView类型和共享数据
 *  ModelAndView 模型和视图
 *  Spring提供此对象可以集中管理共享数据操作和设置跳转视图操作
 *  ModelAndView 只能使用请求转发
 */
@RequestMapping("/method2")
public ModelAndView method2() {
	ModelAndView mv = new ModelAndView();
	//共享数据,等价于 request对象共享数据的级别
	//mv.addObject(attributeName, attributeValue)
	mv.addObject("username", "杨过");
	//页面跳转,等价于request对象的请求转发
	//mv.setViewName(viewName);
	mv.setViewName("/WEB-INF/response/response.jsp");
	return mv;
}
3.通过Model方式-设置共享数据
/*
 * Model方式 :  直接将需要共享的数据封装到Model对象中即可
 * 	方法返回String字符传直接,返回需要跳转的地址即可
 * 	 默认使用请求转发
 */
@RequestMapping("/method3")
public String method3(Model m) {
	//m.addAttribute(attributeName, attributeValue)
	m.addAttribute("username", "剑神123");
	//没有配置视图解析器之前的写法
	//return "/WEB-INF/response/response.jsp";
	//配置视图解析器之后的写法
	return "model"; //返回逻辑视图名称
}
4.自定义请求转发和重定向跳转的页面
// 自定义请求转发页面跳转的地址 : forward: 跳转的地址
@RequestMapping("/method4")
public String method4(Model m) {
	// m.addAttribute(attributeName, attributeValue)
	m.addAttribute("username", "东方姑娘");
	return "forward:/WEB-INF/views/index.jsp";
}
// 自定义重定向页面跳转的地址 redirect: 跳转的地址
@RequestMapping("/method5")
public String method5() {
	return "redirect:http://www.jd.com";
}
5.返回对象类型和共享数据

方法不返回ModelAndView也不返回String类型对应的逻辑视图名称直接返回一个Pojo对象
如果直接返回Pojo对象,项目又配置了视图解析器规则

如果方法中没有返回ModelAndView对象,此时SpringMVC不知道视图在哪里.

此时需要配置视图解析器org.springframework.web.servlet.view.InternalResourceViewResolver.

物理视图路径为:前缀+请求路径(上下文路径+资源名称)+后缀

必须保证视图解析器路径下面必须有 请求路径对应的页面

spring mvc返回日期格式化 spring mvc返回页面_spring


@ModelAttribute作用如下:

1、设置请求参数绑定到Model对象中并传到视图页面的key名.

2、将方法返回值或请求参数绑定到Model对象中并传到视图页面

@ModelAttribute("userKey")//跳转页面使用el表达式获取的对应的属性名称
	@RequestMapping("/method6")
	public User method6() {
		User user = new User();
		user.setUsername("东方姑娘");
		user.setPassword("dfgn");
		user.setEmail("dfgn@qq.com");
		user.setPhone("234234234324");
		return user;
	}
6.转换JSON数据

在web开发中,前台页面经常会发送ajax请求从后台请求数据,ajax请求给前台的数据一般都是json 数据。
SpringMVC支持自动将对象转换JSON格式的数据响应给客户端(浏览器)
SpringMVC默认使用的是 jackson 作为对象转json的工具
Fast-json Alibaba
Gson google
Json-lib Apache

@ResponseBody 会将当前方法直接返回字符串 ,不再进行页面跳转

@Controller
public class JsonController {
	@RequestMapping("/getUserJson")
	@ResponseBody //把响应的内容设为普通字符串
	public User getUserJson() {
		User user = new User();
		user.setUsername("东方姑娘");
		user.setPassword("dfgn");
		user.setEmail("dfgn@qq.com");
		user.setPhone("234234234324");
		return user;
	}
	
	@RequestMapping("/getUserJsonList")
	@ResponseBody
	public List<User> getUserJsonList() {
		User user = new User();
		user.setUsername("东方姑娘");
		user.setPassword("dfgn");
		user.setEmail("dfgn@qq.com");
		user.setPhone("234234234324");
		
		List<User> list = new ArrayList<>();
		list.add(user);
		list.add(user);
		list.add(user);
		list.add(user);
		return list;
	}
}