在完成网页与前端交互的基础功能之后,我们进一步对MVC开发进行简化,分别了解以下几个功能:
一、RestFul风格
是一种风格,而不是约束
以前的传参方式:htttp://127.0.0.1:8080/test?name=张三&age=18
RestFul风格传参:htttp://127…0.0.1:8080/test/张三/18
优点:简洁、高效、安全
代码实现:
@RequestMapping("/test/{name}/{age}")
public String test(@PathVariable String name,@PathVariable String age, Model model){
//接受参数,并存入Model
model.addAttribute("mgr",name+"----------"+age);
return "next";
}
二、接收、发送数据
在WEB-INF目录下的jsp文件,只能通过controller层进行return、forward进行转发跳转
不能被重定向、前端文件直接跳转访问,
1.发送(请求转发、重定向)
使用视图解析器:直接return、原理为请求转发
return "/test";
不使用视图解析器:
注解:@RestController
当@Controller注解替换为此注解时,此类中所有请求均不走视图解析器
return "forward:"WEB-INF/jsp/test.jsp"; 请求转发
return "redirect:/index.jsp"; 重定向
2、接收
(1)提交的名称与方法参数一致
htttp://127…0.0.1:8080/test?name=张三
@RequestMapping("/test")
public String test(String name){
model.addAttribute("mgr",name);
return "next";
(2)提交名称与方法参数不一致
htttp://127…0.0.1:8080/test?username=张三
@RequestMapping("/test")
public String test(@RequestParam("username") String name){
model.addAttribute("mgr",name);
return "next";
(3)提交对象
htttp://127…0.0.1:8080/test?name=张三&sex=男&age=21
(1)新建实体类User
(2)传参
参数名必须和对象变量名 一致,不然参数为空
@RequestMapping("/test")
public String test(User user){
System.out.println(user);
return "next";
3、解决数据传输乱码
Spring内置过滤器
<filter>
<filter-name>filter</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>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
三、拦截器
Spring的拦截器,与之前Javaweb中的过滤器作用相同
1.编写拦截器类,需要继承HandlerInterceptor接口
public class Myinterceptor implements HandlerInterceptor {
//return true 放行
//return false 停止运行,不推荐使用
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("-----------程序运行之前--------------");
//获取URI(URL中的控制器)
if(request.getRequestURI().contains("login")){//只要URI中包含login就放行
System.out.println("包含log:放行");
return true;
}
//获取Session
String session = (String) request.getSession().getAttribute("testsession");
//没有Session代表没登录,让去登陆
if(session==null||session==""){
System.out.println("叉出去");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
}
System.out.println("包含session,放行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("-----------程序运行之后--------------");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("-----------清理开始运行--------------");
}
}
2.Spring注册拦截器
<!-- 拦截器设置 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.xawl.interceptor.fillter.Myinterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
3.总结
拦截级别:方法级别的拦截
拦截方式:独立的AOP方式
四、JSON
json是一种轻量级的数据交换格式、使用文本格式来存储数据
作用:前后端分离:
后段部署、负责提供接口、提供数据;前段接收展示
Java对象装换为JSON字符串,发送至前端
第一种方式:新建对象转换
//新建对象
User user = new User();
user.setName("张三");
user.setAge(12);
user.setSex("男");
model.addAttribute("user_java",user);
//JSON对象
ObjectMapper om = new ObjectMapper();
//转换
String s = om.writeValueAsString(user);
model.addAttribute("user_json",s);
第二种方式:封装类方法调用
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
//新建日期
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sf.format(new Date());
model.addAttribute("user_java",new Date());
String s = JSON.toJSONString(format);
model.addAttribute("user_json",s);
JSON过滤器: 在前后端交互中,传输JSON字符串,出现中文乱码问题:
<!--JSON乱码问题-->
<!--处理器映射器,处理器适配器合二为一,被整合为:-->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>