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.
物理视图路径为:前缀+请求路径(上下文路径+资源名称)+后缀
必须保证视图解析器路径下面必须有 请求路径对应的页面
@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;
}
}