初学者——Servlet学习第二天

Servlet的前端与后台交互过程的简述

第一步:前端发送数据到后台对应的接口

第二步:controller接受请求解析数据,并将数据传递给Service

第三步:service处理数据包括但不仅限于判空,组装成对象,改变某些个值等等,然后确定是不是使用数据库,如果使用的话,是增还是删改查?确定完成以后,调用Dao里面的方法,如果过程不是通用的增删改查过程,那么就在对应的DAO类里面写成一个新方法来处理数据内容

第四步:连接数据库,并且操作数据库(CRUD),得到结果通过方法返回值返回给Service

第五步:service接受到返回值,处理数据内容,然后通过方法,返回给Controller

第六步:Controller根据service的返回值确定应该展示什么内容

servlet一般情况下的生命周期

加载----->创建----->执行----->销毁
先执行构造方法,在执行init方法,后执行service方法,最后执行destory。

构造方法
    //构造方法不能带参数,才能被web.xml识别
    //当浏览器访问到这个项目的的时候,Tomcat才会创建Controller对象
    //这样的好处在于可以节省资源
    //当请求第一次抵达这里时,创建一个Controller对象
    //当请求第二次抵达时,由于之前已经创建过对象,所以不再创建对象了
    
init 初始化
    //只执行一次,它是在服务器装入Servlet时执行的,负责初始化Servlet对象。

service方法
    //Servlet的核心,负责响应客户的请求。
    //所谓service方法,是针对请求来说的,当一个请求到达Tomcat时
    //Tomcat会调用Servlet的Service方法,来确定具体执行哪个do(默认的服务功能是调用与HTTP请求的方法相应的do功能)
    //请求每过来一次就会执行一次service方法
destory方法
 //当对象销毁的时候才调用destroy方法
  //仅执行一次,在服务器端停止且卸载Servlet时执行该方法。
 // 当Servlet对象退出生命周期时,负责释放占用的资源。
//  一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
具体示例:简单实现一下登陆的过程。

1、创建实体类User

public class User {

  //一个User对象就是数据库中一行记录
    private int id;
    private String username;
    private String pwd;

    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 getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
 }

2、创建Dao层类

  • Util类:放置url和username和pwd的,因为将参数写在了web.xml里。
public class Util {
    public static String DBURL="" ;
    public static String DBUN= "";
    public static String DBPWD="";

}
  • BaseDao:用来连接数据库
public abstract class BaseDao<T> {

    static {
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public Connection getConnection() {
        try {
            //Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_foo?useSSL=true&serverTimezone=UTC","root","235689");
            //优化
            Connection conn = DriverManager.getConnection(Util.DBURL,Util.DBUN,Util.DBPWD);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public abstract T select(T t);

}
  • UserDao:继承BaseDao
public class UserDao extends BaseDao<User> {

    @Override
    public User select(User user) {
        Connection conn = this.getConnection();
        String sql = "select id,username from tb_users where username=? and pwd=?";
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1,user.getUsername());
            ps.setString(2,user.getPwd());
            ResultSet rs = ps.executeQuery();
            if(rs.next()) {
                User u = new User();
                u.setId(rs.getInt("id"));
                u.setUsername(rs.getString("username"));
                return u;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

3、创建Service层

  • IUserService:接口
public interface IUserService {
    User login(String username, String pwd);
}
  • UserService:实现IUserService
public class UserService implements IUserService {

    UserDao dao = new UserDao();

    @Override
    public User login(String username, String pwd) {
        if (username == null || username.isEmpty()){
            return null;
        }
        if (pwd == null || pwd.isEmpty()) {
            return null;
        }
        User u = new User();
        u.setUsername(username);
        u.setPwd(pwd);
        User result = dao.select(u);
        return result;
    }
}

4、创建Controller

  • LoginController:继承HttpServlet

public class LoginController extends HttpServlet {

    IUserService service = new UserService();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username =req.getParameter("username");
        String pwd = req.getParameter("pwd");
        User user = service.login(username,pwd);
        if (user != null) {
            resp.sendRedirect("success.html");//登陆成功,以重定向方式转到登陆成功页面——success.html
        }else {
            resp.getWriter().println("登陆失败");
        }
    }
}

5、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>login</servlet-name>
        <servlet-class>test.controller.LoginController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login.do</url-pattern>
    </servlet-mapping>
    
    <servlet>
        <servlet-name>controller</servlet-name>
        <servlet-class>test.controller.Controller</servlet-class>
        <init-param>
            <param-name>db_url</param-name>
            <param-value>jdbc:mysql://localhost:3306/db_foo?useSSL=true&amp;serverTimezone=UTC</param-value>
        </init-param>
        <init-param>
            <param-name>db_un</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>db_pwd</param-name>
            <param-value>root</param-value>
        </init-param>
       <!-- 表示一进来就初始化-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    
</web-app>

以上就是实现了一个user的简单登陆过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值