今天利用servlet实现注册的功能。这里我们用GET请求来向浏览器发送数据。OK,我们看具体实现吧。
分层模型
controller:
- 1、TestService.java:接受数据
- 2、Service.java:创建实体类对象,并传入dao层中
model:
- 3、user.java:用户实体类
- 4、BaseDao.java:连接数据库配置
- 5、UserDao.java:查询数据库并返回一个结果
init:
- 6、Config.java:根据web.xml文件中的信息,配置数据库连接所需要的内容。
- 7、web.xml中的配置文件
配置步骤:
- 首先登记控制器用doget()请求获得数据。
- 登记控制器将得到的数据传入用户服务中去
①用户服务将发过来的数据转换成了一个user对象
②然后将user对象传给UserDao,将user作为一条记录插入表中 - UserDao将获取数据库连接,然后将一条记录插入到表中,user就是一条记录
- 控制器用用户服务的register()判断是否插入,并向浏览器返回数据
数据字典:
- ① TestService:控制层的路由过程, 此模块只是接受传过来的用户名和密码,并向业务过程发送数据 。
- ② Service:控制层的业务过程(biz层):一般做的事情是对数据的处理,比如数据是否合法、准备向外发还的数据是否正确,对于数据计算出结果 。
- ③ User:对Base应的是数据库中的一张表, 每一个对象对应着数据库中的一条记录。
- ④ Basedao:加载数据库驱动,获取数据库连接,然后将一条记录插入到表中。
- ⑤ UserDao:将一条记录插入到表中,并向Service返回一条消息。
具体实现:
①TestService.java
public class TestServlet extends HttpServlet {
Service service = new Service();
@Override
public void init() throws ServletException {
Config.url = getInitParameter("url");
Config.username = getInitParameter("username");
Config.pwd = getInitParameter("pwd");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=UTF-8");
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
User user = new User();
user.setUsername(username);
user.setPwd(pwd);
if (service.operation(user)) {
resp.getWriter().write("注册成功");
}else {
resp.getWriter().write("注册失败");
}
}
}
②Service.java
public class Service {
UserDao dao = new UserDao();
public boolean operation(User user) {
if (user.getUsername() == null || user.getPwd() == null) {
return false;
}
return dao.insert(user) != 0;
}
}
③user.java
public class 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;
}
}
④BaseDao
public class BaseDao {
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Connection getConnection() {
try {
Connection con = DriverManager.getConnection(Config.url, Config.username, Config.pwd);
return con;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
⑤UserDao
public class UserDao implements IUSerDao {
BaseDao dao = new BaseDao();
@Override
public int insert(User user) {
Connection conn = dao.getConnection();
String sql = "insert into tb_user(username, pwd) values(?, ?)";
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, user.getUsername());
ps.setString(2, user.getPwd());
return ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return 0;
}
}
⑥Config
public class Config {
public static String url;
public static String username;
public static String pwd;
}
⑦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>regin</servlet-name>
<servlet-class>com.ali.test.controller.TestServlet</servlet-class>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/db_foo?useSSL=true&serverTimezone=UTC</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>数据库名</param-value>
</init-param>
<init-param>
<param-name>pwd</param-name>
<param-value>密码</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>regin</servlet-name>
<url-pattern>/test.do</url-pattern>
</servlet-mapping>
</web-app>
注意:
这里要强调的是:在web.xml中的数据库的配置信息称为魔鬼字,因为你要部署的时候有可能会遇到要改这些信息的时候,所以在web.xml文件中写好,初始化的时候配置就好了,后期也可以更改。
- getInitParameter(String s):我们用这个方法来获取web.xml的初始化配置信息。在web.xml中这样配置.
<init-param>
<param-name>配置名</param-name>
<param-value>具体参数</param-value>
</init-param>
- 通常我们用注解来配置好servlet的访问名称,web.xml里面只是配置初始化信息。可以专门写一个servlet,要求在Tomcat启动的时候创建,专门加载初始化配置文件。其他的servlet就可以使用配置信息了,一般在web.xml中用这句来配置。
<load-on-startup>1</load-on-startup>
- servlet中的构造方法不能带参数,带参数的话再web.xml文件中会出错,所以要记住。
这样我们就写好了注册过程,有兴趣的还可以写一下登录过程。
Tomcat和Servlet是如何工作的
步骤:
- 浏览器向Servlet容器(Tomcat)发出Http请求
- Servlet容器接收浏览器的请求
- Servlet容器创建一个HttpResponse对象
- Servlet容器调用HttpServlet对象的init()方法,初始化配置参数,然后调用service方法分析请求方式,把HttpRequest对象与HttpResponse对象作为参数传给HttpServlet 对象。
- HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息,并根据逻辑代码处理请求信息。
- HttpServlet调用HttpResponse对象的有关方法封装逻辑代码的执行结果,生成响应数据。
执行流程图: