上一篇文章中文中给大家介绍了ServletAPI,如果是初学者的话可能看不大明白,看不明白不要紧,你只需要知道Servlet技术是JavaEE中的一种技术规范。
昨天给大家分享了一些枯燥的知识点,那么今天就带着大家用昨天的知识点完成一个网站登录界面的模块吧。
好了,进入今天的主题,一般我们在访问一些大型的网站的时候,都会有一个注册登录的流程,那么这个流程是怎么实现的呢??
其实过程很简单,来看下面这张图:
简单来说登录的过程其实并不难理解。可以看到上述的图中描述了8个过程。其实一般的web应用的标准都是这样的。大家可以看到,用户在浏览器端输入username和password之后点击登录按钮,点击登录按钮之后用户填写的表单数据就会被提交到服务器端。
从上面的图中可以看出,在服务器端划分为了三个部分,其实这就是传说中的web三层架构。先来创建一个动态项目,目录结构看下面这张图:
不难发现,其实服务器端的每个部分都对应于一个包。先忽略domain包和util包。
所谓web三层架构其实就是根据需求划分不同的功能模块,通常的情况下,将服务端分为web层、service层和dao层。web层主要就是处理浏览器提交的用户表单数据,将该数据封装成对象传递到service层,
我们先来在web包下创建一个Servlet,具体代码如下:
/**
* Servlet implementation class UserServlet
*/
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
try {
//1、接受表单提交的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
//2、封装到实体对象中
User user = new User();
user.setUsername(username);
user.setPassword(password);
//3、调用业务层处理数据
UserService userService = new UserService();
User exisUser = userService.login(user);
//4、根据处理结果显示信息
if(exisUser == null) {
response.getWriter().println("fial .....");
}
else {
response.getWriter().println("success....");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
看上面的代码,该Servlet继承了HttpServlet。并且重写了doGet和doPost两个方法。仔细看的话你会发现,不管提交方式是get还是post,上述的程序均可以运行。
在web层中主要的逻辑是第一步,先接收用户提交的表单数据。接着将该数据封装成user对象,其中我们会定义一个User类,该类描述了一个用户的实例。其中有用户id,用户名username和用户密码password,看下面的代码:
package login.domain;
public class User {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
private String username;
private String password;
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;
}
}
这个类位于domain包下,所谓domain就是存放尸体的包。
好了,web层的第二步就是将第一步中的获得的用户表单数据封装到user的实例中去,
第三步:将第二步中封装好的对象传递到service层。
第四步:根据查询的结果返回信息。稍后讲解。
好了,web层已经讲解完毕,来看service层;同样的,先来看下面的代码
public class UserService {
/**
* 调用dao层,完成查询数据
* @param user
* @return
* @throws SQLException
*/
public User login(User user) throws SQLException {
// TODO Auto-generated method stub
//调用dao层,完成查询数据
UserDao userDao = new UserDao();
return userDao.login(user);
}
}
可以看得出,service层中很简单,只有一个调用dao层,查询数据库。你可能会觉得很简单。其实,在实际的开发中service层的作用也是如此,根据不同的业务逻辑,调用dao层去查询数据库。但是,在实际开发中service层被称为业务逻辑层,一般是最复杂的一层,由于这次的例子很简单,所以service层也就比较简单。
好了,service层也搞定了,还剩下dao层了吧,好了,来看dao层的部分
public class UserDao {
public User login(User user) throws SQLException {
// TODO Auto-generated method stub
QueryRunner queryRunner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from user where username=? and password=?";
User query = queryRunner.query(sql,new BeanHandler<User>(User.class),user.getUsername(),user.getPassword());
return query;
}
}
可以看到,dao层中有sql语句,没错,dao层其实就是操作数据库,根据service层传递过来的逻辑业务来查询数据库表,并将结果返回。
好了,做到了这里,这个小demo就已将完成了。
回到web层的第四步,现在我们知道了,dao层将查询数据库得到的结果返回给service层,service层在传递到web层。好了这个时候就到了web层的第四步了。第四步就是将service层返回的结果解析,然后将结果解析的内容反馈给用户。
好了,到此为止!
快去试试这个小demo吧
下一篇中给大家做一个注册的模块。实现网站搭建的注册登录模块,