使用SpringWeb+Thymeleaf和前后端分离两种技术完成同一个多层架构的web项目,项目内容为用户登录界面,具体代码是什么
时间: 2023-06-19 22:02:49 浏览: 126
首先,我们需要了解一下多层架构的概念以及SpringWeb和Thymeleaf的基本用法。
多层架构一般包括展示层、业务逻辑层和数据访问层。展示层负责展示页面和接收用户的请求,业务逻辑层负责处理业务逻辑,数据访问层负责访问数据库等持久化存储。在这个项目中,我们需要实现用户登录功能,所以需要设计三个模块分别对应这三个层次。
接下来,我们分别介绍使用SpringWeb+Thymeleaf和前后端分离两种技术完成该项目的代码实现。
## SpringWeb+Thymeleaf实现
先来看一下使用SpringWeb+Thymeleaf实现的代码。这里我们使用SpringBoot作为项目基础框架,pom.xml文件如下:
```xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
```
接下来,我们需要编写Controller层、Service层和DAO层的代码。这里我们省略了Service层,直接在Controller层中处理业务逻辑。
首先是Controller层的代码:
```java
@Controller
public class UserController {
@Autowired
private UserDao userDao;
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String doLogin(@RequestParam String username, @RequestParam String password, Model model) {
User user = userDao.findByUsername(username);
if(user != null && user.getPassword().equals(password)) {
model.addAttribute("user", user);
return "success";
} else {
model.addAttribute("error", "用户名或密码错误");
return "login";
}
}
}
```
在这个Controller中,我们使用@GetMapping和@PostMapping注解分别对应GET和POST请求,处理用户登录功能。其中,@RequestParam注解用于获取请求中的参数,Model对象用于将结果返回给页面。
接下来是DAO层的代码:
```java
@Repository
public class UserDao {
private static final Map<String, User> users = new ConcurrentHashMap<>();
static {
users.put("admin", new User("admin", "admin"));
users.put("user", new User("user", "user"));
}
public User findByUsername(String username) {
return users.get(username);
}
}
```
在这个DAO中,我们使用一个静态Map来模拟数据库,实现根据用户名查询用户的功能。
最后是Thymeleaf模板,我们使用Thymeleaf实现页面渲染和表单提交。login.html代码如下:
```html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form action="/login" method="post">
<label for="username">Username:</label>
<input type="text" name="username" id="username">
<br>
<label for="password">Password:</label>
<input type="password" name="password" id="password">
<br>
<input type="submit" value="Login">
</form>
<p th:text="${error}"></p>
</body>
</html>
```
success.html代码如下:
```html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Login Success</title>
</head>
<body>
<h1>Login Success</h1>
<p th:text="'Welcome, ' + ${user.username}"></p>
</body>
</html>
```
在Thymeleaf模板中,我们使用th:text属性将结果返回给页面。
## 前后端分离实现
接下来我们来看一下使用前后端分离技术实现的代码。在这个项目中,我们使用Vue.js作为前端框架,axios库作为HTTP请求库。
首先是前端代码,login.html代码如下:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app">
<h1>Login</h1>
<form v-on:submit.prevent="doLogin">
<label for="username">Username:</label>
<input type="text" v-model="username" id="username">
<br>
<label for="password">Password:</label>
<input type="password" v-model="password" id="password">
<br>
<input type="submit" value="Login">
</form>
<p v-if="error" style="color:red">{{ error }}</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
username: '',
password: '',
error: ''
},
methods: {
doLogin: function() {
axios.post('/api/login', {
username: this.username,
password: this.password
}).then(function(response) {
if(response.data.success) {
window.location.href = '/success';
} else {
app.error = response.data.message;
}
}).catch(function(error) {
console.log(error);
});
}
}
});
</script>
</body>
</html>
```
在这个Vue.js组件中,我们使用axios库发送POST请求,将结果显示在页面上。
接下来是后端代码,UserController和UserDao的代码与上面一致,只是返回结果需要改为JSON格式。这里我们使用@RestController注解来处理HTTP请求。
```java
@RestController
public class UserController {
@Autowired
private UserDao userDao;
@PostMapping("/api/login")
public Map<String, Object> doLogin(@RequestBody Map<String, String> params) {
Map<String, Object> result = new HashMap<>();
User user = userDao.findByUsername(params.get("username"));
if(user != null && user.getPassword().equals(params.get("password"))) {
result.put("success", true);
} else {
result.put("success", false);
result.put("message", "用户名或密码错误");
}
return result;
}
}
```
在这个Controller中,我们使用@PostMapping注解处理POST请求,@RequestBody注解用于获取请求体中的参数。返回结果使用Map来表示JSON格式的数据。
最后,我们还需要在SpringBoot的配置文件中添加以下配置,允许跨域请求:
```
spring:
cors:
allowed-origins: "*"
allowed-methods: GET,POST,PUT,DELETE
```
至此,我们已经完成了使用前后端分离技术实现的代码。
阅读全文