Dados de resposta do SpringMVC
Resposta da palavra-chave
//转发
如果用了 forward:则路径必须写成实际视图 url,不能写逻辑视图。
它相当于“request.getRequestDispatcher("url").forward(request,response)”。使用请求
转发,既可以转发到 jsp
@RequestMapping("/testForward")
public String testForward() {
System.out.println("AccountController 的 testForward 方法执行了。。。。");
return "forward:/WEB-INF/pages/success.jsp";
//重定向
return "redirect:testReturnModelAndView";
它相当于“response.sendRedirect(url)”。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。
ModelAndView
é um objeto fornecido pelo SpringMVC para nós, o objeto também pode ser usado como o valor de retorno do método do controlador.
Existem dois métodos neste objeto:
@RequestMapping("/testReturnModelAndView")
public ModelAndView testReturnModelAndView() {
ModelAndView mv = new ModelAndView();
mv.addObject("username", "张三");//向request域中存入数据
mv.setViewName("success");//转发页面
ResponseBody dados de resposta
Requisito:
Use a anotação @ResponseBody para converter o objeto retornado pelo método do controlador em uma resposta json para o cliente.
O Springmvc usa o MappingJacksonHttpMessageConverter para converter dados json por padrão.Você precisa adicionar o jacksonannotations2.9.0.jar do jackson, databind, pacote de dados principal.
Nota: As versões abaixo da 2.7.0 não podem ser usadas para
resolver problemas de codificação:
@RequestMapping (value = "/ testResponseJson", produz = "application / json; charset = utf-8")
@Controller("jsonController")
public class JsonController {
/**
* 测试响应 json 数据
*/
@RequestMapping("/testResponseJson")
public @ResponseBody Account testResponseJson(@RequestBody Account account) {
System.out.println("异步请求:"+account);
return account; } }
Manipulação de exceção no SpringMVC
Exceção personalizada:
1 Gravar classe de exceção e página de erro
异常类:
package com.wz;
public class SysException extends Exception {
private String message;
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public SysException(String message) {
this.message = message;
}
}
错误页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${errormsg}
</body>
</html>
2 O manipulador de exceção personalizado implementa a interface HandlerExceptionResolver
package com.wz;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SysExceptionResovler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
SysException ex = null;
if (ex instanceof Exception){
ex = (SysException)e;
}else {
ex = new SysException("系统正在维护。。。。");
}
ModelAndView mv = new ModelAndView();
mv.addObject("errormsg",ex.getMessage());
mv.setViewName("error");
return mv;
}
}
3 Configure o manipulador de exceções
<bean class="com.wz.SysExceptionResovler" id="e"></bean>
Interceptor personalizado
Qual é o uso:
- Se o programador decidir que o interceptador interceptará a solicitação e depois chamará outros interceptores ou o processador de negócios
- Se for processado, ele retornará verdadeiro. * Se o programador decidir que não há necessidade de chamar outros componentes para processar a solicitação, ele retornará false.
Os filtros fazem parte da especificação do servlet e qualquer projeto da web em java pode ser usado.
O interceptador é próprio da estrutura SpringMVC e funciona apenas com a estrutura SpringMVC.
Depois que o filtro é configurado com / * no padrão de URL, ele pode interceptar todos os recursos a serem acessados.
Interceptador É um método controlador que apenas intercepta o acesso.Se o acesso for jsp, html, css, image ou js não serão interceptados.
É também uma aplicação específica do pensamento sobre AOP.
Se quisermos personalizar interceptores, devemos implementar: Interface HandlerInterceptor.
A primeira etapa: escreva uma classe comum para implementar a interface HandlerInterceptor
- Depois que o processador de negócios processou a solicitação, mas o DispatcherServlet é chamado antes de retornar uma resposta ao cliente,
- Nesse método, a solicitação do usuário é processada.
public class HandlerInterceptorDemo1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle 拦截器拦截了");
return true; }
- Depois de executar a camada de controle
- Nesse método, a solicitação é processada na segunda etapa.
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler,ModelAndView modelAndView) throws Exception {
System.out.println("postHandle 方法执行了");
}
- Depois que todos os processadores de negócios são executados, eles são chamados após a resposta,
- Nesse método, os recursos são liberados.
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse
response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion 方法执行了");
} }
Etapa 2: configurar o interceptador
Ao usar o SpringMVC, um interceptador de sessão é configurado para interceptar se o usuário está logado, mas o usuário não precisa interceptar ao acessar a página de login e a página de registro, essa tag é necessária
<mvc:execlude-mapping />//写在指定拦截的后面
作用路径可以通过在配置文件中配置。
<!-- 配置拦截器的作用范围 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" /><!-- 用于指定对拦截的 url -->
<mvc:exclude-mapping path=""/><!-- 用于指定排除的 url-->
<bean id="handlerInterceptorDemo1" class="com.itheima.web.interceptor.HandlerInterceptorDemo1"></bean>
</mvc:interceptor>
</mvc:interceptors>