servlet+jsp+JDBC+MVC设计模式的一次综合练习

1.在java web中学完servlet,jsp与JDBC以后,基本上也算是接近成功了。后续的阶段在继续学习一些框架:Spring+Struts1+Strucs2+Hibernate.这些开源的框架主要是用来快速的开发java web程序。现在我来总结一下在不使用这些开源框架的情况下的一些基本知识点。我们通过实际的操作来复习

2.我们来实现一个很简单的用户登陆功能。具体的需求是:用户在前端的HTML页面(也可以是JSP)注册信息,提交到servlet,servlet经过处理以后对用户的信息实现页面的重定向,并且检测数据的合法性,将合法有用的数据存到数据库。用户界面还有显示所有数据的功能,可以将后台数据库的数全部取出放在页面上展示。

3.首先我们准备一个很简单的用户登陆表单。是一个html页面,然后是登陆成功过的和登陆失败的两个JSP页面,这里我们只是演示,所以简单的写一下:就在这两个页面中写:登陆成功和登陆失败。

(1)注册表单:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <form action="/student/register.html" method="post">
  <ol>
  <li>姓名<input type="text" name="username"></li>
  <li>学号<input type="text" name="xh"></li>
  <li>密码<input type="password" name="password"></li>
  <li><input type="submit" value="提交"></li>
  </ol>
  </form>
</body>
</html>

(2)登陆成功的页面:

<%@ page language="java" contentType="text/html; "
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
out.print("恭喜你登陆成功");
%>
</body>
</html>

(3)登陆失败的页面:

<%@ page language="java" contentType="text/html; "
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%

out.print("登陆失败");
out.print("请检查用户名或者密码是否正确");
%>
</body>
</html>

4.准备后台的数据库,数据库的驱动,以及链接。

扫描二维码关注公众号,回复: 2724759 查看本文章

(1)我们使用的是MYSQL数据库。所以加载mysql数据库的驱动。在网上下载该驱动:

//http://dev.mysql.com/downloads/connector/。

//(注意下载的时候要选择java的mysql)。这是一个jar包,拿到之后,注意!!不要自己新建lib文件,因为工程已经预留了了

空间。在WEB-Content目录下的web-inf中有一个lib文件夹,拷进去。然后buildpath导入jar包即可。

(2)建立数据库:打开MYSQL数据库,建立一张学生表,我命名为users。这里建立users表的时候你可以选择使用可视化的数据库管理工具,比如navicat,也可以使用SQL语句。表一共四列:id(主键,自增),name,xh(学号),password.如果使用可视化编辑工具,没什么好说的,如果是SQL语句,那么对应的SQL语句是:

CREATE TABLE `users` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `xuehao` varchar(30) DEFAULT NULL,
  `password` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

(3)封装数据库的链接。当我们把驱动准备好以后,这个时候我们在java资源类中新建一个java文件,来封装这一操作,当然你也可以选择不封装,那么代码的逻辑会看起来很乱。我们建立:linkJdbc.java类:代码如下。这个linkJdbc封装了获取链接的方法和关闭当前数据库的方法。把这些方法定义成static类型,我们无需定义对象直接通过类名访问资源。

package com.student;//包名

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class linkJdbc {
    //解释一下下边这句话:url指的是数据库的位置jdbc:mysql://。这是固定的格式,localhost
    //指的是主机的名字,这里我们使用的本地机器。3306是MYSQL的端口号。student是我们数据库的名字
    static private String url="jdbc:mysql://localhost:3306/student";
    static private String user = "root";//用户名
    static private String password = "123456";//密码
    //封装获取连接的方法
    public static Connection getMysql()
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接
          return (Connection) DriverManager.getConnection(url,user,password);
        
        }catch(Exception e)
        {
            return null;
        }
    }
    //封装关闭数据库连接的方法
    public static void close(Connection conn,Statement ste,ResultSet rs)
    {
        if(rs!=null)
        {
            try
            {
                rs.close();
            } catch (SQLException e)
            {
                
                e.printStackTrace();
            }
        }
        if(ste!=null)
        {
            try
            {
                ste.close();
            } catch (SQLException e)
            {
                
                e.printStackTrace();
            }
        }
        if(conn!=null)
        {
            try
            {
                conn.close();
            } catch (SQLException e)
            {
            
                e.printStackTrace();
            }
        }
    }
    //重载关闭函数
    public static void close(Connection conn,Statement ste)
    {
        if(ste!=null)
        {
            try
            {
                ste.close();
            } catch (SQLException e)
            {
                
                e.printStackTrace();
            }
        }
        if(conn!=null)
        {
            try
            {
                conn.close();
            } catch (SQLException e)
            {
            
                e.printStackTrace();
            }
        }
    }
    //继续重载
    public static void close(Connection conn)
    {
        if(conn!=null)
        {
            try
            {
                conn.close();
            } catch (SQLException e)
            {
            
                e.printStackTrace();
            }
        }
    }
}

5.建立处理数据的servlet。分为保存数据至数据库的save 和load

(1)获取前端传回来的数据并保存至数据库。这个设计难度其实不大,首先通过request获取表单的数据,对数据验证(这个验证其实在前端就可以完成,使用JavaScript脚本程序就可以完成验证,如果不合法就不会被传到后台,这样的设计会减小后台的压力,验证的阶段放在浏览器上),合法数据存入数据库。代码如下:

package com.student;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class save extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private Connection conn=null;
    private PreparedStatement ste=null;
    private String sql=null;
    public save()
    {
        
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        
    
        try
        {

         /获取数据
            String name=request.getParameter("username");
            String xuehao=request.getParameter("xh");
            String password=request.getParameter("password");

     //调用函数初始化链接
           conn=linkJdbc.getMysql();
          //  System.out.println(conn);//你可以在这里把链接答应出来,看看是否成功
            sql="insert into users(name,xuehao,password)values(?,?,?)";
           ste=conn.prepareStatement(sql);
            ste.setObject(1, name);
            ste.setObject(2, xuehao);
           ste.setObject(3, password);
           ste.executeUpdate();
           System.out.println(name+" "+xuehao+" "+password);//这里可以将数据打印到控制台
            //数据处理完毕之后进行页面的跳转
            if(name!=null&&!name.equals(""))
            {
                request.getRequestDispatcher("/success.jsp").forward(request, response);
            }
            else
            {
                request.getRequestDispatcher("/fail.jsp").forward(request, response);
            }
            } catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {

       //关闭访问的资源
            linkJdbc.close(conn, ste);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        //dogpost调用doget
        doGet(request, response);
    }

}

(2)访问数据库,取出资源。这里的实现难度其实也不大。但是我们为了实现数据的共享,我们首先建立一个person()类,封装这些数据,然后将person封装在一个list里面,通过session共享出去。这样在页面上就可以访问到资源。首先是建立一个person类

package com.student;
public class person {
    private int id;
    private String name;
    private String xuehao;
    private String password;
    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 getXuehao() {
        return xuehao;
    }
    public void setXuehao(String xuehao) {
        this.xuehao = xuehao;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setId1(int id2) {
        // TODO Auto-generated method stub
        
    }
    
}

我们给这个类添加get和set方法。然后是读取数据库的信息。这个其实也很简单,和保存是相反的:建立数据库链接,使用SQL语句返回一个ResultSet的结果集,遍历该结果集的元素,然后将数据封装在person中,再把person放在list中共享出去,在页面上直接访问这个变量即可。

代码如下:

package com.student;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * 访问数据库数据,拿出来并且展示在页面上
 */
public class load extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private Connection conn=null;
    private PreparedStatement ste=null;
    static private String url="jdbc:mysql://localhost:3306/student";
    static private String user = "root";//用户名
    static private String password = "123456";//密码
    private String sql=null;
    public load()
    {
     
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
      conn=linkJdbc.getMysql();
      sql="select*from users";
      try
      {
        PreparedStatement ps=conn.prepareStatement(sql);
        //保存查询的结果集
        ResultSet rs=ps.executeQuery();
        List studentlist=new ArrayList();
        //将结果集的数据取出并且封装到student内.
        while(rs.next())
        {
            int id=rs.getInt(1);
            String name=rs.getString(2);
            String xuehao=rs.getString(3);
            String password=rs.getString(4);
            person p=new person();
            p.setName(name);
            p.setPassword(password);
            p.setXuehao(xuehao);
            studentlist.add(p);
            HttpSession session=request.getSession();
            session.setAttribute("studentlist", studentlist);
            System.out.println(id+" "+name+" "+" "+xuehao+" ");
        }
        
        
      }
      catch (SQLException e) {
        
        e.printStackTrace();
    }
      
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
    
        doGet(request, response);
    }

}

到此为止我们基本实现了servlet+jsp+jdbc的一个小的应用。其实这并不完善,至少还存在两点问题。

(1)我们没有使用过滤器,这样用户可能直接不用登陆就访问到我们的只有登陆成功才能访问的页面,所以我们应该使用Filter来防止这个问题,并且在Filter中我们应该指定所有页面的字符编码。来避免乱码问题。

(2)上个厕所回来就忘了..................

猜你喜欢

转载自blog.csdn.net/weixin_41863129/article/details/81488136