JavaEE笔记(一):Spring MVC登陆页面
- New Project →
- Spring Initializr(生成空spring项目的web应用程序) →
- Dependencies选择Web的Spring Web和Template Engines的Apache Freemarker
1. 修改配置文件
src/main/resources/application.properties
sever.port = 8888 //修改端口,默认是8080
spring.freemarker.suffix=.html //设置返回视图名后缀
spring.freemarker.settings.classic_compatible=true //解决前台使用${}赋值为空的情况
2. 写HTML文件
src/main/resources/static (静态,可以直接在网站显示)
src/main/resources/templates (动态,Spring Boot默认存放模板页面的路径)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 align="center">welcome</h1>
<br>
<div align="center">
<form action="/login_submit" method="post">
name: <input type="text" name="name" value="sa"> <br>
pass: <input type="text" name="pass" value="sa"> <br>
<input type="submit" value="tijiao">
</form>
<font color="red"> ${msg}</font>
</div>
</body>
</html>
<!-- align="center" 居中
# action="/login_submit" 表单的信息会传到"/login_submit"的页面
-->
3. 建Handler
src/main/java/com
- new package controller →
- new class LoginHandler
package com.controller;
import com.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.util.Map;
@Controller
public class LoginHandler {
@RequestMapping({"/login","/"})
public String login(){
return "/login";//对应login.html视图
}
@RequestMapping("/login_submit")
public String login_submit(String name, @RequestParam("pass") String password, HttpSession session , Map map){
if("sa".equals(name) && "sa".equals(password)) {
session.setAttribute("name",name);
return "redirect:/user/main.html";
}
else {
map.put("msg","wrong password!");
return "/login";
}
}
@RequestMapping("/login_submit2")
public String login_submit2(@Valid User user, BindingResult result,HttpSession session , Map map){
System.out.println(user);
if(result.hasErrors()){
// for(rr:result.getAllErrors()){
//
// }
}
if("sa".equals(user.getName()) && "sa".equals(user.getPass())) {
session.setAttribute("name",user.getName());
return "redirect:/user/main.html";
}
else {
map.put("msg","wrong password!");
return "/login";
}
}
@RequestMapping("/user/main.html")
public String main(){
return "/user/main";
}
@RequestMapping("/user/logout")
public String logout(HttpSession session){
session.removeAttribute("name");
return "forward:/login";
}
}
//@RequestMapping默认属性是value,标注在一个方法或类上
//HttpSession:通过session对象得到session中存储的对象
//session.setAttribute("name",name);在服务器中开辟一个空间保存
//session.getAttribute("name");取得
//session.removeAttribute("name");删除指定名称的绑定对象
//public String login_submit(String name, @RequestParam("pass") String password, HttpSession session , Map map)
//数据绑定:将请求消息数据与后台方法参数建立连接的过程
//用注解@RequestParam绑定请求参数到方法入参,即将请求中pass参数的值赋给方法中的形参password
//当请求参数"pass"不存在时会有异常发生,可以通过设置属性required=false解决,例如: @RequestParam(value="pass", required=false)
//Map:可以将该值存储在一个Map对象.,通过键来访问对应的值
//put(Object k, Object v)将指定的值v与此映射中的指定键k关联
//public String login_submit2(@Valid User user, BindingResult result,HttpSession session , Map map)
//参数校验
//@Valid 用于验证注解是否符合要求,直接加在变量user之前,在User类中添加验证信息的要求,当不符合要求时就会在方法中返回msg的错误提示信息。
//@Valid和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后),每个@Valid后面跟着的BindingResult就是这个@Valid的验证结果。
实体类
src/main/java/com
- new package entity→
- new class User
package com.entity;
import javax.validation.Valid;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
public class User {
@NotBlank
private String name;
private String pass;
@Valid
private User father;
@Min(0) @Max(100)
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User getFather() {
return father;
}
public void setFather(User father) {
this.father = father;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", pass='" + pass + '\'' +
", father=" + father +
'}';
}
}
//@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
//使用@NotBlank等注解时,一定要和@valid一起使用,不然@NotBlank不起作用
//@Override 的作用是:如果想重写父类的方法,在方法前面加上@Override 系统可以帮你检查方法的正确性
//类必须有get和set方法
拦截器
配置拦截器
如何将IntercepterConfig拦截器添加到SpringBoot的配置中,让SpringBoot项目有这么一个拦截器存在。
- 新创建一个IntercepterConfig类
- 将拦截器的配置以及拦截的路径配置好
(registry.addInterceptor此方法添加拦截器)
src/main/java/com
- new package config→
- new class IntercepterConfig
package com.config;
import com.filter.LoginIntercepter;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class IntercepterConfig implements WebMvcConfigurer {
//配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginIntercepter())
.addPathPatterns("/user/**");
}
}
//registry.addInterceptor(new LoginIntercepter())添加拦截器
拦截器
- 创建LoginIntercepter类,实现HandlerInterceptor接口
- 重写其父类方法
- 添加如果没有session状态重定向至"/login?msg=xxx"
src/main/java/com
- new package filter→
- new class LoginIntercepter
package com.filter;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginIntercepter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession sess = request.getSession();
if( sess.getAttribute("name")!=null){
return true;
}else
{
response.sendRedirect("/login?msg=xxx");
}
return false;
}
}
//HttpServletRequest接口:最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据。
//HttpServletResponse接口:在Servlet中,当服务器响应客户端的一个请求时,就要用到
//HttpSession getSession():无请求参数。获取当前request关联的session,如果当前request没有session,创建一个session.
//response.sendRedirect("/login?msg=xxx");重定向.发送一个临时的响应到客户端