一:项目的框架
项目主要是由三部分组成:
前端的页面 Servlet 以及 数据库
二:数据库设计部分
(1) 先建立数据库
(2)导入数据库连接池的jar包到utils目录下并且要把jar选择:set as a path,效果如下:
jar包的左边有一个向右指的箭头
(3)在resources包下添加配置文件用来保存数据库连接池的信息
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/servlettest?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
三:web前端设计部分
(1) 前端页面的设计
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>前端WEB页面</title>
</head>
<body>
<form action="registertest" method = "post">
Username:<input type="text" name="username" ><br>
Password:<input type="text" name="password"><br>
Gender:<input type="radio" name="gender" value="female">男
<input type="radio" name="gender" value="male">女<br>
Interests: <input type="checkbox" name="interests" value="sport"> 运动
<input type="checkbox" name="interests" value="read"> 阅读
<input type="checkbox" name="interests" value="movie"> 电影<br>
Gradution:<select name="gradution">
<option value="gz">高中</option>
<option value="dz">大专</option>
<option value="bk">本科</option>
<option value="ss">硕士</option>
</select><br>
Profile:<textarea name="profile"></textarea><br>
<input type="submit" value="提交" >
</form>
</body>
</html>
效果如下:
四:Servlet的设计部分
package com.whx.servlet;
import com.whx.domain.User;
import com.whx.utils.DbUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@WebServlet(value="/registertest")
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前端的数据<单个的>
String username = req.getParameter("username");
String password = req.getParameter("password");
String gender = req.getParameter("gender");
String gradution = req.getParameter("gradution");
String profile = req.getParameter("profile");
//获取前端的数据<多个的>
String[] interests = req.getParameterValues("interests");
//把部分从前端获取的数据进行处理
//处理性别数据:
String gen = "male".equals(gender) ? "M" : "F";
//处理数组中的兴趣数据
StringBuffer interestStringBuffer = new StringBuffer();
for(String interest:interests){
interestStringBuffer.append(interest+",");
}
String interestStr = interestStringBuffer.substring(0, interestStringBuffer.length() - 1);
//调用把数据写入数据库的方法
insertRegisterInfo(username,password,gen,gradution,profile,interestStr);
//==========================根据用户名查询用户信息=====================
User user = queryInfo(username);
// ===================以下代码是响应给前端的============================
// 设置写在html页面的字体的编码方式
resp.setContentType("text/html;charset=utf-8");
// 获取一个输出流,http的响应其实就是一个输出流
PrintWriter writer = resp.getWriter();
StringBuffer html = new StringBuffer();
html.append("<html>")
.append("<head></head>")
.append("<body><h1>注册成功</h1>")
.append("<p>用户名: " + user.getUsername() + "</p>")
.append("<p>性别: " + user.getGender() + "</p>")
.append("<p>描述: " + user.getProfile() + "</p>")
.append("<p>兴趣爱好: " + user.getInterests() + "</p>")
.append("</body></html>");
writer.write(html.toString());
writer.flush();
writer.close();
}
//把数据写入到到数据库的过程封装成方法
private void insertRegisterInfo(String username ,String password ,String gender , String gradution , String profiles, String interests){
Connection conn = DbUtils.getConnection();
String sql ="insert into user(username , password , gender,graduation,profile,interests) values(?,?,?,?,?,?)";
try {
//获取执行对象
PreparedStatement preparedStatement = conn.prepareStatement(sql);
//给占位符赋值
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
preparedStatement.setString(3,gender);
preparedStatement.setString(4,gradution);
preparedStatement.setString(5,profiles);
preparedStatement.setString(6,interests);
//执行sql语句
preparedStatement.executeUpdate();
//释放资源
DbUtils.close(null,preparedStatement,conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
private User queryInfo(String username){
User user = new User();
String sql ="select * from user where username = ?";
//获取连接
Connection conn = DbUtils.getConnection();
try {
//获取预处理对象
PreparedStatement ps = conn.prepareStatement(sql);
//给sql语句放数据
ps.setString(1,username);
//获取结果集
ResultSet rs = ps.executeQuery();
while (rs.next()){
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
//因为在数据库中男女存的是M或者F 所以在获取到性别信息之后要进行处理
String gender = rs.getString("gender"); //获取到性别
user.setGender(gender.equals("M")?"男":"女"); //设置性别
//因为兴趣的返回值可能为sports,movie
String interestsStr = rs.getString("interests");
//将兴趣的字符串以逗号拆分成数组
String[] interests = interestsStr.split(","); //["sport", "movie"]
//拼接用户的爱好: 运动 电影 阅读
StringBuffer interestStringBuffer = new StringBuffer();
//循环的时候 interest 的值为: read sport movie
for(String interest:interests){
// 得到中文的兴趣爱好
String cnInterests = convertInterests(interest); //这是把英文爱好转换为中文的方法
interestStringBuffer.append(cnInterests + " ");
}
//设置兴趣爱好: 运动 电影 阅读
user.setInterests(interestStringBuffer.toString());
user.setProfile(rs.getString("profile"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
//定义将英文的兴趣爱好 转换为 中文的方法
private String convertInterests(String enInterests){
String cnInterests = null;
switch (enInterests){
case "sport":
cnInterests = "运动";
break;
case "movie":
cnInterests = "电影";
break;
case"read":
cnInterests= "阅读";
break;
}
return cnInterests;
}
}
五:注意事项
(1) 放置jar包的lib目录设置的位置必须是web目录下-->WEB_INF-->lib 目录结构不能搞错
(2)Servlet中的注解@WebServlet() 中value的值对应的是html页面中action的值 两者的值必须是相同的,否则前端的请求无法找到对应的Servlet
value的值中一定一定要加上"/" 表示绝对路径
而HTML页面中的action中的值是不需要加上"/"的,因为他表示的是相对路径
(3)编码问题:
- 在响应给HTML页面中要设置该页面的编码方式,以防中文的乱码现象
// 设置写在html页面的字体的编码方式 resp.setContentType("text/html;charset=utf-8");