这里主要就慢慢地来解析一下RegisterServlet的具体逻辑
首先吧,我们需要在myeclipse重新创建一个WebProject
在这里我就直接命名为SecondServlet了
创建后我们就能看到这么堆东西了:
我们在src这个文件夹里面创建一个test包用来存放servlet文件:
然后在test包里面就可以创建我们的servlet文件了,当然了,这里创建的就是RegisterServlet
下面我先贴一下RegisterServlet的相关代码吧
package test; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONObject; public class RegisterServlet extends HttpServlet { /** * Constructor of the object. */ public RegisterServlet() { super(); } /** * Destruction of the servlet. */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); // 设置响应报文的编码格式 PrintWriter pw = response.getWriter(); // 获取 response 的输出流 pw.println("xxxx"); // 通过输出流把业务逻辑的结果输出 pw.flush(); } /** * The doPost method of the servlet. * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userTable="user"; String name = request.getParameter("userName"); // 从 request 中获取名为 account 的参数的值 String password = request.getParameter("userPassword"); // 从 request 中获取名为 password 的参数的值 System.out.println("name:" + name + "\npassword:" + password); // 打印出来看一看 ResultSet resultSet; String result=""; int updateResult=-1; /* 这里我们做一个最简单的注册逻辑,当然,你的实际业务可以相当复杂 */ try { Connection connect = DBUtil.getConnection(); Statement statement = (Statement) connect.createStatement(); // Statement可以理解为数据库操作实例,对数据库的所有操作都通过它来实现 String sqlQuery = "select * from " + userTable + " where userName='" + name + "'"; resultSet = statement.executeQuery(sqlQuery); // 先查询同样的账号(比如手机号)是否存在 if(resultSet.next()){ // 已存在 result ="existed"; } else { // 不存在 String sqlInsertPass = "insert into " + userTable + "(userName,userPassword) values('"+name+"','"+password+"')"; // 更新类操作返回一个int类型的值,代表该操作影响到的行数 updateResult= statement.executeUpdate(sqlInsertPass); // 插入帐号密码 if(updateResult!=-1){ result="ok"; }else { result="false"; } } } catch (SQLException e) { e.printStackTrace(); } response.setContentType("text/html;charset=utf-8"); // 设置响应报文的编码格式 JSONObject object=new JSONObject(); object.put("result", result); String res=JSONObject.fromObject(object).toString(); PrintWriter out = response.getWriter(); out.print(res); out.flush(); } /** * Initialization of the servlet. * * @throws ServletException if an error occurs */ public void init() throws ServletException { // Put your code here } }
虽然这代码看起来是挺长的,但是在这次要完成的东西中,我们要关注的其实也就只是doPost()方法,因为在客户端方面,我是打算用post方法来发送请求的,所以在Servlet 方面接收数据也就是doPost()。
说了这么多,终于可以进入主题了,那现在就来慢慢分析doPost()的代码吧
String userTable="user"; String name = request.getParameter("userName"); // 从 request 中获取名为 account 的参数的值 String password = request.getParameter("userPassword"); // 从 request 中获取名为 password 的参数的值
首先吧,开始的时候我们需要的就是获取从服务端发送过来的数据了,request.getParmeter()就是这么个作用。
Connection connect = DBUtil.getConnection(); Statement statement = (Statement) connect.createStatement(); // Statement可以理解为数据库操作实例,对数据库的所有操作都通过它来实现
这两句的话就是进行数据库操作了,基本涉及到数据库操作的都需要进行这个操作
另外附上DBUtil的代码,这个工具类用于进行Servlet与数据库连接
package test; import java.sql.*; import com.mysql.*; public class DBUtil { private static Connection mConnection; /** * 获取数据库连接 * * @return 唯一数据库连接 */ public static Connection getConnection() { if (mConnection == null) { String url = "jdbc:mysql://localhost:3306/user"; // 数据库的Url try { Class.forName("com.mysql.jdbc.Driver"); // java反射,固定写法 mConnection = (Connection) DriverManager.getConnection(url, "root", "1040322934ss"); System.out.println("创建数据库连接"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { System.out.println("SQLException: " + e.getMessage()); System.out.println("SQLState: " + e.getSQLState()); System.out.println("VendorError: " + e.getErrorCode()); } } return mConnection; } /** * 查询操作 * * @param querySql *查询操作SQL语句 * @return 查询 * @throws SQLException */ public static ResultSet query(String querySql) throws SQLException { Statement stateMent = (Statement) getConnection().createStatement(); return stateMent.executeQuery(querySql); } /** * 插入、更新、删除操作 * * @param insertSql *插入操作的SQL语句 * @return * @throws SQLException */ public static int update(String insertSql) throws SQLException { Statement stateMent = (Statement) getConnection().createStatement(); return stateMent.executeUpdate(insertSql); } /** * 关闭数据库连接 */ public static void closeConnection() { if (mConnection != null) { try { mConnection.close(); mConnection = null; } catch (SQLException e) { System.out.println("数据库关闭异常:[" + e.getErrorCode() + "]" + e.getMessage()); } } } }
url,连接数据库的用户名和密码自己定义
url为所连接数据库的路径
这部分就是具体的查表逻辑了,定义mysql查询语句,然后用statement.executeQuery()进行数据库操作,操作完后会返回一个resultSet对象,resultSet对象存放了查询到的内容
查询完后, 需要执行帐号存在判断,如果resultSet是有内容的,就说明数据库查到了已存在要注册的帐号。resuletSet.next()就是判断resultSet对象是否有内容的
对应查询的结果,返回不同的内容给客户端。例如查到了,想返回给客户端的就是existed。
最后,这部分就是准备返回东西给客户端了。可以看出,我们主要是想把那个result 返回给客户端。
在之前我们的result只是一个只有结果的字符串,就比如"existed"这样而已,我们并不想返回这么个东西给客户端,返回的结果应该是一个json主体的字符串才对。 那么我们需要做的就是
单纯的字符串→jsonObject对象
jsonObject对象→json主体的字符串
转化到了最后,返回的应该是{"result":"existed"}这么一个字符串,而不是"existed"
到了这里,RegisterServlet端解析完毕