学习目标:
在学习了servlet和http之间的交互,也迎来了第一个小项目,在此之前也学习了MySQL-JDBC,于是尝试做一个简单的登录页面
例如:
- 主要温习了SQL语句以及HTTP交互协议
代码撰写流程:
登录小项目流程
1、使用原生的方式生成页面
2、客户端先发送请求,得到要登录的页面
3、用户填写相应的用户数据,发送请求给服务端
4、服务端接受到请求后进行逻辑处理
5、服务端将处理之后的结果返回给客户端
1.首先要常见一个loginservlet的一个Java类:客户端先发送请求
package com.mashibing.control;
import com.mashibing.entity.User;
import com.mashibing.service.UserService;
import com.mashibing.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
public class LoginServlet extends HttpServlet {
UserService userService=new UserServiceImpl();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String name=request.getParameter("name");
String pwd=request.getParameter("pwd");
User user=new User(name,pwd);
User u= null;
try {
u = userService.checkUser(user);
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(u);
if(u!=null){
response.getWriter().write("success");
}else {
response.getWriter().write("failure");
}
}
}
2.得到登录页面
package com.mashibing.control;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class PageServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接受到客户端的请求,返回响应登陆页面");
response.setContentType("text/html");
PrintWriter out=response.getWriter();
out.write("<html>");
out.write("<head>");
out.write("</head>");
out.write("<body>");
out.write("<form action='login' method='get'>");
out.write("name:<input type='text' name='name' value=''/><br/>");
out.write("pwd:<input type='text' name='pwd' value=''/><br/>");
out.write(" <input type='submit' value='loading'>");
out.write("</from>");
out.write("</body>");
out.write("</html>");
}
}
3.用户填写相应的用户数据,发送请求给服务端
package com.mashibing.entity;
public class User {
private int id;
private String name;
private String pwd;
public User( String name, String pwd) {
this.name = name;
this.pwd = pwd;
}public User(int id, String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
package com.mashibing.dao.impl;
import com.mashibing.dao.UserDao;
import com.mashibing.entity.User;
import java.sql.*;
public class UserDaoImpl implements UserDao {
@Override
public User checkUser(User user) {
Connection connection=null;
Statement statement=null;
PreparedStatement pst=null;
ResultSet resultSet=null;
User u=null;
try{
Class.forName("com.mysql.cj.jdbc.Driver");
//因为JDBC中是MYSQL专门提供的jar包,所以url都是一致的,后面的user和password是根据数据库那边自己设置的
connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/login","root","20010612Syf@");
statement=connection.createStatement();
//这是一条查询的SQL语句
pst = connection.prepareStatement("select * from user where name = ?and pwd =?");
pst. setString(1,user.getName());
pst.setString(2, user.getPwd());
resultSet = pst.executeQuery();
/* String sql="select * from user where username=?";
pst=con.prepareStatement(sql);*/
// resultSet=statement.executeQuery("select name,pwd from user");
// pst = con.prepareStatement;
//调用next()方法可以将游标移动到下一行,如果下一代没有数据,则返回false
while(resultSet.next()){
//注意这里打印输出的数据类型需要和数据库表中的数据一致,不然也会报错
u=new User(resultSet.getInt("id"),resultSet.getString("name"),resultSet.getString("pwd"));
}
}catch(Exception e){
e.printStackTrace();
}finally{//调用finally方法,强制执行下面三个方法,关闭数据流,节约内存
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/* Connection con=null;
PreparedStatement pst=null;
ResultSet rs=null;
User u=null;
try{
Class.forName("com.mysql.cj.jdbc.Driver");
con= DriverManager.getConnection("jdbc:mysql://localhost:3306/login","root", "20010612@Syf");
pst = con.prepareStatement("select * from user where name = ?and pwd =?");
pst. setString(1,user.getName());
pst.setString(2, user.getPwd());
rs = pst.executeQuery();
while (rs.next()){
u=new User(rs.getInt("id"),rs.getString("name"),rs.getString("pwd"));
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
pst.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}*/
return u;
}
}
package com.mashibing.dao;
import com.mashibing.entity.User;
import java.sql.SQLException;
public interface UserDao {
User checkUser(User user) throws ClassNotFoundException, SQLException;
}
package com.mashibing.service.impl;
import com.mashibing.dao.UserDao;
import com.mashibing.dao.impl.UserDaoImpl;
import com.mashibing.entity.User;
import com.mashibing.service.UserService;
import java.sql.SQLException;
public class UserServiceImpl implements UserService {
UserDao userDao=new UserDaoImpl();
/* @Override
public User checkUser(User user) {
return userDao.checkUser(user);
}*/
@Override
public User checkUser(User user) throws SQLException, ClassNotFoundException {
return userDao.checkUser(user);
}
}
package com.mashibing.service;
import com.mashibing.entity.User;
import java.sql.SQLException;
public interface UserService {
User checkUser(User user) throws SQLException, ClassNotFoundException;
}
中间出现的坎坷可谓是一波三折
肠子都哭青了的事情
servlet.jar不小心加错了,应该在Libraries里面添加的,但是由于惯性居然在Modules加了,导致servlet.jar一直加载失败
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--用来获取登陆页面的请求-->
<servlet>
<servlet-name>PageServlet</servlet-name>
<servlet-class>com.mashibing.control.PageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PageServlet</servlet-name>
<url-pattern>/page</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.mashibing.control.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
最最让人难受的事情还得是SQL语句写错,做了各种各样的尝试,更换版本、修改了MYSQL配置,一度以为是密码的错误,甚至修改了my.ini配置文件。
感想:纪念一下第一个小项目,用别人做过的项目就连环境配置都要一模一样啊