7.1 项目流程
- 使用原生的方式生成页面
- 客户端先发送请求,得到要登录的页面
- 用户填写相应的用户数据,发送请求给服务端
- 服务端接收到请求后,进行逻辑处理
- 服务端将处理后的结果返回客户端
7.2 代码分层:这里指应该分几个包
M:模型 V:视图 C:控制器
- java:control–>service–>dao,代码书写从内向外,即先编写dao层,然后编写service层,最后control
- control:接收参数–C
- service:进行逻辑处理–C
- dao:数据库交互–M
- html–V
7.3 代码
- HelloWorld:用于动态返回登录页面,放在control包下
package control;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloWorld extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("接收到客户端请求,返回响应的页面");
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<form action='login' method='get'>");
resp.getWriter().write("username:<input type='text' name='name' value=''><br/>");
resp.getWriter().write("password:<input type=\"text\" name=\"pwd\" value=\"\"><br/>");
resp.getWriter().write("<input type=\"submit\" value=\"login\">");
resp.getWriter().write("</form>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
resp.getWriter().write("</html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
- User:表中数据,对应java中的类,放在entity包下
package 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.id = id;
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 + '\'' +
'}';
}
}
- 导入Oracle驱动包:两种方式
- 将Oracle驱动包放入WEB-INF/lib目录下,并重新生成out路径,这样才能在out路径下的lib中,导入该jar包
- 直接导入jar包也可以
- UserDao:与数据库交互的接口,放在dao包内
package dao;
import entity.User;
public interface UserDao {
public User checkUser(User user);
}
- UserDaoImpl:与数据库进行交互的具体实现,放在dao/impl包内
package dao.impl;
import dao.UserDao;
import entity.User;
import java.sql.*;
public class UserDaoImpl implements UserDao {
@Override
public User checkUser(User user) throws SQLException, ClassNotFoundException {
//1. 要使用JDBC接口,需要先将对应数据库的具体实现类加载进来,jdk6以后不需显示加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2. 根据url连接参数,找到与之匹配的Driver对象,调用其方法获取连接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.15.110:1521:fcrhost","c50hst","c50hst");
PreparedStatement stmt = conn.prepareStatement("select * from user_table where name = ? and pwd = ?");
stmt.setString(1,user.getName());
stmt.setString(2,user.getPwd());
ResultSet rs = stmt.executeQuery();
while(rs.next()){
User u = new User(rs.getInt("name"),rs.getString("name"),rs.getString("pwd"));
}
//3. 依次关闭ResultSet,Statement,Connection等资源
rs.close();
stmt.close();
conn.close();
}
}
- UserServiceInterface:处理业务逻辑的接口:放在service包内
package service;
import entity.User;
import java.sql.SQLException;
public interface UserServiceInterface {
public User service(User user) throws SQLException, ClassNotFoundException;
}
- UserServiceImpl:处理业务逻辑的具体实现,业务逻辑中会包括与数据库交互(调用dao层),以及其他逻辑,放在service/impl包内
package service.impl;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import entity.User;
import service.UserServiceInterface;
import java.sql.SQLException;
public class UserServiceImpl implements UserServiceInterface {
UserDao ud = new UserDaoImpl();
@Override
public User service(User user) throws SQLException, ClassNotFoundException {
return ud.checkUser(user);
}
}
- LoginServlet:接收参数,调用service层
package control;
import entity.User;
import service.UserServiceInterface;
import 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 {
UserServiceInterface userServiceInterface = new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
String pwd = req.getParameter("pwd");
User u = new User(name, pwd);
User user = null;
try {
user = userServiceInterface.service(u);
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if (user != null) {
resp.getWriter().write("success");
} else {
resp.getWriter().write("failure");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
- web.xml配置
<?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>HelloWorld</servlet-name>
<servlet-class>control.HelloWorld</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LogIn</servlet-name>
<servlet-class>control.LoginServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LogIn</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>