什么是三层构架:
-
Servlet【控制层】只做接受请求和响应
-
Dao【数据访问层】只做数据库操作
-
Service【业务层】只做业务逻辑,判断和数据的处理
具体的流程:
首先创建数据库,让后网页发送请求到服务器,服务器中的 servlet 接收到数据,然后把数据传给 service ,servi对接收到的数据进行处理,然后把处理的数据传递给Dao ,Dao调用JDBC去访问数据库并把得到的结果封装成对象返回给service,service对返回的数据进行处理,把处理的结果返回给servlet,然后servlet做除响应。
搭建项目框架时,要将 jar 包放在 web-inf/lib 下,
创建三层架构的包有:Dao、model(数据库的映射)、service、servlet、util(就是封装的DBUtil)。
实体类(model包中):
import java.util.Date; public class User { private int id; private String username; private String password; private Date birthday; private String phone; private String address; public User(int id, String username, String password, Date birthday, String phone, String address) { this.id = id; this.username = username; this.password = password; this.birthday = birthday; this.phone = phone; this.address = address; } public User() { } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", birthday=" + birthday + ", phone='" + phone + '\'' + ", address='" + address + '\'' + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
编写登录页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <form action="login" method="post" > 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="登录"><br> </form> </body> </html>
配置web.xml
<servlet> <servlet-name>login</servlet-name> <servlet-class>com.qf.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
在servlet包中创建LoginServlet 继承 HttpServlet
import com.qf.model.User; import com.qf.service.impl.LoginServiceImpl; import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; /** * 登录Servlet */ public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //首先解决请求乱码(中文) request.setCharacterEncoding("utf-8"); //其次解决响应乱码(中文) response.setContentType("text/html;charset=utf-8"); // 1 接收请求 String username = request.getParameter("username"); String password = request.getParameter("password"); // 2 调用业务层.处理数据 LoginServiceImpl service = new LoginServiceImpl( ); User user = service.findUserByUsernameAndPassword(username,password); // 3 响应 if (user != null) { System.out.println("登录成功!欢迎"+user.getUsername()+",你的地址是:"+user.getAddress() ); }else { System.out.println("用户名或密码错误!" ); } } }
在service包中创建业务接口LoginService然后用一个类去 实现这个接口
public interface LoginService { // 登录 User findUserByUsernameAndPassword(String username,String password); } public class LoginServiceImpl implements LoginService { @Override public User findUserByUsernameAndPassword(String username, String password) { // 1.对接收的数据处理,再调用数据库 LoginDaoImpl loginDao = new LoginDaoImpl( ); User user = loginDao.findUserByUsernameAndPassword(username,password); // 2.对数据库的数据再处理,再返回给控制层Servlet return user; } }
在数据访问层dao包中创建一个接口并用一个类实现这个接口
public interface LoginDao { User findUserByUsernameAndPassword(String username,String password); } //在dao包下创建一个类实现接口 import com.qf.dao.LoginDao; import com.qf.model.User; import com.qf.util.DBUtil; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; public class LoginDaoImpl implements LoginDao { @Override public User findUserByUsernameAndPassword(String username, String password) { // 加载驱动,获得连接 Connection conn = DBUtil.getConnection( ); PreparedStatement ps = null; ResultSet rs = null; User user = null; // 编写sql String sql = "select * from user where username = ? and password = ?"; try{ // 预处理 ps = conn.prepareStatement(sql); // 占位符赋值 ps.setString(1,username); ps.setString(2,password ); // 执行,返回结果集 rs = ps.executeQuery( ); if(rs.next()) { user = new User( ); int id = rs.getInt("id"); String uname = rs.getString("username"); String pwd = rs.getString("password"); String phone = rs.getString("phone"); String address = rs.getString("address"); Date birthday = rs.getDate("birthday"); user.setId(id); user.setUsername(uname); user.setPassword(pwd); user.setAddress(address); user.setPhone(phone); user.setBirthday(birthday); } }catch (Exception e) { e.printStackTrace(); }finally { DBUtil.closeAll(rs,ps,conn); } return user; } }
注解:
注解又称为注释,它是给程序看的注释。
自定义注解:
注解加元注解:
-
元注解是给注解的注解
-
@Target (自定义注解目标,即注解能作用哪些地方)
-
@Retention (注解的保留策略,即注解在什么时期生效)
-
@Documented
-
@Inherited
target:
取值ElementType | 所修饰的范围 |
---|---|
package | 包上 |
type | 类/接口/数组/枚举/注解 |
construction:构造方法,field:属性,method:方法 | 类型成员 |
local-variavle:局部变量,parameter:参数 | 方法中的参数和局部变量 |
retention:
取值RetentionPolicy | 作用 |
---|---|
source | 在源文件中有效 |
class | 在class文件中有效 |
runtime | 在运行时有效,为runtime可以在反射机制中读取 |