Prefácio
Acabei de aprender o springMVC e apresentarei anotações comuns, na esperança de melhorar minha compreensão e aplicação do springMVC, e espero ajudar a todos!
Em primeiro lugar, conhecemos a arquitetura de três camadas do lado do servidor: camada de apresentação, camada de negócios e camada de persistência, e springMVC é a estrutura da camada de apresentação.
Fluxo de trabalho MVC:
primeiro, o cliente (geralmente um navegador) faz uma solicitação. O primeiro componente a aceitar essa solicitação é geralmente um controlador frontal. Ele entrega diferentes solicitações a diferentes controladores de back-end para processamento, e o controlador de back-end pode chamar o objeto de modelo correspondente para processar a lógica de negócios específica e, finalmente, retornar uma resposta de visão específica ao cliente.
A figura a seguir mostra os detalhes da operação da estrutura springMVC:
Fluxo de trabalho SpringMVC: O
primeiro controlador de front-end que aceita essa solicitação é chamado DispatcherServlet, e o controlador de back-end é chamado de Controller. O responsável pelo processamento da URL de solicitação e mapeamento do controlador de back-end se chama HandMapping, possui vários tipos e é mais flexível, além de ser configurado em arquivo xml. O objeto de modelo responsável pelo processamento da lógica de negócios é geralmente o componente DAO / DTO que normalmente escrevemos. Mas seu retorno final é mais flexível. O controlador retorna um objeto ModelAndView para DispatcherServlet. ModelAndView pode carregar um objeto de visualização ou o nome lógico de um objeto de visualização. Se ele carrega o nome lógico de um objeto de visualização, o DispatcherServlet precisa de um ViewResolver para localizar o objeto de visualização usado para renderizar a resposta. Finalmente, DispatcherServlet despacha a solicitação para o objeto de visualização especificado pelo objeto ModelAndView. O objeto de visualização é responsável por renderizar a resposta retornada ao cliente.
(Da Enciclopédia Sogou)
@Controlador:
Atuando na classe, indica que a classe atual é uma classe controladora Após adicionar esta anotação, o framework spring irá escanear o método da classe que usa a anotação, e irá detectar se o método usa a anotação @RequestMapping.
@RequestMapping :
Função: usado para estabelecer a correspondência entre o URL da solicitação e o método de processamento da solicitação
. Escopo: o escopo está no método ou na classe. Se a anotação for usada na classe, o acesso JSP à página precisa ser anterior ao caminho do método de acesso href Adicione o
atributo path da classe :
path: path
value: alias do path
method: determine o valor do método de solicitação é um tipo enumerado
params: "username" você solicitará este método mais tarde, você deve me passar um atributo de nome de usuário se o comentário tiver um valor para nome de usuário Então, o valor de nome de usuário também deve ser o valor que você passa.
Headers: cabeçalhos de solicitação que devem ser incluídos na solicitação de envio
@Controller
public class HelloController {
@RequestMapping(path = "/Hello",params={"username=heihei"},headers={"Accept"})
public String sayHellio() {
System.out.println("Hello SpringMVC");
return "success";
}
}
@RequestParam :
Cenário: Se o parâmetro carregado não corresponder ao parâmetro do método acessado, o parâmetro não pode ser obtido, então o que devo fazer?
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name = "name") String username) {
System.out.println("执行了");
System.out.println(username);
return "success";
}
@RequestBody :
É usado para obter o conteúdo do cabeçalho da solicitação, que é obtido diretamente na forma de key = value & key = value. O
método get request não está disponível
//获取请求体
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body) {
System.out.println(body);
return "success";
}
@RequestHeader :
Obtenha o cabeçalho do pedido especificado
// 获取请求头的值 需要哪个填哪个 (据说可以防爬虫 可以试下)
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header) {
System.out.println(header);
return "success";
}
@CookieValue :
//获取cookie的值
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue) {
System.out.println(cookieValue);
return "success";
}
@ModelAttribute :
Comentário sobre o método
Nesse caso, o método será chamado antes de cada método do controlador ser chamado.
//获取cookie的值
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue) {
System.out.println(cookieValue);
return "success";
}
@SessionAttributes
Usado para execução múltipla de compartilhamento de parâmetro de método entre controladores.
Esta anotação só pode ser usada em classes
//@SessionAttributes(value = {"msg"}) //把msg存入到session域中
//获取SessionAttributes的值
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Model model) {
System.out.println("testSessionAttributes执行了");
//底层会存储到request域当中
model.addAttribute("msg", "haha");
return "success";
}
@RequestMapping("/getSessionAttributes")
public String getSessionAttributes(ModelMap model) {
System.out.println("testSessionAttributes执行了");
//从session中获取值
String msg = (String) model.get("msg");
System.out.println(msg);
return "success";
}
@RequestBody encapsula automaticamente o corpo da solicitação e a correspondência do bean
@ResponseBodyt converte automaticamente os beans em dados json
contar com:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
ps: Ao usar o upload de ajax do jquery, resolva o problema de interceptação de recurso estático
springmvc.xml
<!--前端控制器,哪些静态资源不拦截 两参数:请求路径带js任何文件也都不拦截 以后js下的任何文件都不拦截 -->
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
//模拟异步请求和响应
@RequestMapping("/testAjax")
public @ResponseBody User1 testAjax(@RequestBody User1 user1) { //拿到请求体的内容
System.out.println("异步");
//客户端发送的是ajax请求 传的是json字符串,后端把json字符串封装到user1对象中
System.out.println(user1);
//做响应,模拟查询
user1.setUsername("查完了");
user1.setAge(40);
user1.setPassword("ahha");
System.out.println(user1);
//做响应
return user1;
}
Acima estão algumas anotações comuns. Vou detalhar o interceptor de upload, upload e download de arquivos, tratamento de exceções e outros artigos mais tarde!