servlet应用
servlet应用
建立一张用户表,用servlet校验用户名密码,只有在用户表中存在的用户才能登录到系统主页。
(1)编写一个servlet进行用户名和密码校验,获取登录页面的用户名密码,并显示出来
(2)使用cookie,如果用户在登录时选择保存登录信息,30天内,用户无需登录
(3)使用session,显示计科院网站当前在线人数
(4)使用过滤器解决乱码问题,登录时用户名为中文可能不能正常识别,解决该问题
1.用户名和密码校验并显示在网页上
创建数据库及用户表
数据库方面我选择的是mysql。
mysql下载地址:https://dev.mysql.com/downloads/installer/
(1).cmd命令mysql -u root - p 然后输入密码打开数据库

(2).创建用户数据库(create database 数据库名;),然后用命令(show databases;)查看是否创建成功并且打开数据库(use 数据库名;)

(3).创建表(create table 表名(字段名 类型1,字段名 类型2·····);)然后查看表结构(desc 表名;)并插入数据(insert into 表名(字段1,字段2···)values(value1,value2····);)注意英文名称的value值要加上双引号。然后查询表内的值(select * from 表名;)。

(4).连接数据库
下载mysql驱动并添加依赖包
java版本:https://dev.mysql.com/downloads/connector/j/
点击添加选择第一个JARs然后再选择你的mysql驱动文件夹添加进去就行了

Connection con; String driver="com.mysql.jdbc.Driver"; //这里我的数据库是user String url="jdbc:mysql://localhost:3306/user"; String user="root"; String password="123456"; try { Class.forName(driver); con = DriverManager.getConnection(url, user, password); if (!con.isClosed()) { System.out.println("数据库连接成功"); } Statement statement = con.createStatement(); String sql = "select * from user_table;";//我的表格叫user_table ResultSet resultSet = statement.executeQuery(sql); String name; while (resultSet.next()) { name = resultSet.getString("username"); pwd = resultSet.getString("password"); System.out.println("username:" + name + " password:" + pwd); } resultSet.close(); con.close(); } catch (ClassNotFoundException e) { System.out.println("数据库驱动没有安装"); } catch (SQLException e) { System.out.println("数据库连接失败"); }

连接数据库的过程中还是遇到过一点小问题就是刚开始一直连接不成功,然后在网上查阅资料发现是自己的mysql驱动和mysql版本差的太多了,建议驱动和mysql版本尽量差距不要太大,比如我的mysql版本是5.7.13而mysql驱动是5.1.49。
(5).编写servlet验证用户名密码然后在网页上面把用户名和密码显示出来。
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.transform.Result; import java.io.IOException; import java.io.PrintWriter; import java.sql.*; @WebServlet(name = "LoginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); String uname = request.getParameter("username"); String pwd = request.getParameter("password"); Connection con; String driver="com.mysql.jdbc.Driver"; //这里我的数据库是user String url="jdbc:mysql://localhost:3306/user"; String user="root"; String password="123456"; try { Class.forName(driver); con = DriverManager.getConnection(url, user, password); if (!con.isClosed()) { System.out.println("数据库连接成功"); } Statement statement = con.createStatement(); String sql = "select * from user_table where username='"+uname+"' and password='"+pwd+"'"; ResultSet resultSet = statement.executeQuery(sql); if (resultSet.next()) { System.out.println(uname + " " + pwd); System.out.println("用户名:" + uname + " 密码:" + pwd); System.out.println("登录成功,欢迎你 "+uname); out.println("登录成功" + "<br>" + "您的用户名:" + uname + "<br>" + "您的密码:" + pwd); } else{ System.out.println("用户名或者密码错误"); out.println("登录失败" + "<br>" + "用户名或者密码错误"); } resultSet.close(); con.close(); } catch (ClassNotFoundException e) { System.out.println("数据库驱动没有安装"); } catch (SQLException e) { System.out.println("数据库连接失败"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }


输入用户名:tom 密码:123


输入用户名:tom 密码:321
2.cookie的使用
(1)在src文件夹里面创建两个servlet分别命名为SetCookie和GetCookie

(2)然后就是两个servlet里面的代码以及LoginServlet里面添加的代码,分别是创建Cookie以及得到Cookie存储的值
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(name = "SetCookie") public class SetCookie extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie coo = new Cookie("username", "tom");//创建一个键值对的cookie对象 coo.setMaxAge(60*60*24*7);//设置cookie的生命周期 response.addCookie(coo);//添加到response中 } }
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(name = "GetCookie") public class GetCookie extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie coo[] = request.getCookies();//获取request中cookie集合 //循环遍历 for (Cookie co : coo) { System.out.println(co.getName() + ":" + co.getValue()); response.getWriter().println(co.getValue()); } } }
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.transform.Result; import java.io.IOException; import java.io.PrintWriter; import java.sql.*; @WebServlet(name = "LoginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); String uname = request.getParameter("username"); String pwd = request.getParameter("password"); Connection con; String driver="com.mysql.jdbc.Driver"; //这里我的数据库是user String url="jdbc:mysql://localhost:3306/user"; String user="root"; String password="123456"; try { Class.forName(driver); con = DriverManager.getConnection(url, user, password); if (!con.isClosed()) { System.out.println("数据库连接成功"); } Statement statement = con.createStatement(); String sql = "select * from user_table where username='"+uname+"' and password='"+pwd+"'"; ResultSet resultSet = statement.executeQuery(sql); if (resultSet.next()) { System.out.println(uname + " " + pwd); System.out.println("用户名:" + uname + " 密码:" + pwd); System.out.println("登录成功,欢迎你 "+uname); out.println("登录成功" + "<br>" + "您的用户名:" + uname + "<br>" + "您的密码:" + pwd); Cookie cookieUser = new Cookie("username",uname); cookieUser.setMaxAge(60*60*24*30); response.addCookie(cookieUser); Cookie cookiePwd = new Cookie("pwd",pwd); cookiePwd.setMaxAge(60*60*24*30); response.addCookie(cookiePwd); } else{ System.out.println("用户名或者密码错误"); out.println("登录失败" + "<br>" + "用户名或者密码错误"); } resultSet.close(); con.close(); } catch (ClassNotFoundException e) { System.out.println("数据库驱动没有安装"); } catch (SQLException e) { System.out.println("数据库连接失败"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
还有种方法就是用JavaScript来使用Cookie存储用户数据
function getCookie(cname){ var name = cname + "="; var ca = document.cookie.split(';'); for(var i=0; i<ca.length; i++) { var c = ca[i].trim(); if (c.indexOf(name)==0) { return c.substring(name.length,c.length); } } return ""; } function checkCookie(){ var user=getCookie("username"); var uname=document.getElementById("username"); var pwd=getCookie("pwd"); var upwd=document.getElementById("password"); if (user!=""){ var uname=document.getElementById("username"); uname.value=user; upwd=pwd; } } window.onload=function()//用window的onload事件,窗体加载完毕的时候 { checkCookie(); }



3.Session的使用
(1).首先创建一个监听器SessionListener

(2).在web.xml中注册监听器

(3).监听器代码,监听当前网页在线人数并显示出来
import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.*; @WebListener() public class SessionListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener { // Public constructor is required by servlet spec public SessionListener() { } // ------------------------------------------------------- // ServletContextListener implementation // ------------------------------------------------------- public void contextInitialized(ServletContextEvent sce) { /* This method is called when the servlet context is initialized(when the Web application is deployed). You can initialize servlet context related data here. */ } public void contextDestroyed(ServletContextEvent sce) { /* This method is invoked when the Servlet Context (the Web application) is undeployed or Application Server shuts down. */ } // ------------------------------------------------------- // HttpSessionListener implementation // ------------------------------------------------------- public void sessionCreated(HttpSessionEvent event) { /* Session is created. */ HttpSession session = event.getSession(); ServletContext servletContext = session.getServletContext(); Object object = servletContext.getAttribute("number"); if (object==null){ servletContext.setAttribute("number",0); }else { Object num = servletContext.getAttribute("number"); int num1 = (int)num; servletContext.setAttribute("number",num1+1); } } public void sessionDestroyed(HttpSessionEvent event) { /* Session is destroyed. */ HttpSession session = event.getSession(); ServletContext servletContext = session.getServletContext(); servletContext.setAttribute("number",(long) servletContext.getAttribute("number")); } // ------------------------------------------------------- // HttpSessionAttributeListener implementation // ------------------------------------------------------- public void attributeAdded(HttpSessionBindingEvent sbe) { /* This method is called when an attribute is added to a session. */ } public void attributeRemoved(HttpSessionBindingEvent sbe) { /* This method is called when an attribute is removed from a session. */ } public void attributeReplaced(HttpSessionBindingEvent sbe) { /* This method is invoked when an attibute is replaced in a session. */ } }

(4).创建Session
import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import javax.xml.transform.Result; import java.io.IOException; import java.io.PrintWriter; import java.sql.*; @WebServlet(name = "LoginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); String uname = request.getParameter("username"); String pwd = request.getParameter("password"); Connection con; String driver="com.mysql.jdbc.Driver"; //这里我的数据库是user String url="jdbc:mysql://localhost:3306/user"; String user="root"; String password="123456"; try { Class.forName(driver); con = DriverManager.getConnection(url, user, password); if (!con.isClosed()) { System.out.println("数据库连接成功"); } Statement statement = con.createStatement(); String sql = "select * from user_table where username='"+uname+"' and password='"+pwd+"'"; ResultSet resultSet = statement.executeQuery(sql); if (resultSet.next()) { System.out.println(uname + " " + pwd); System.out.println("用户名:" + uname + " 密码:" + pwd); System.out.println("登录成功,欢迎你 "+uname); out.println("登录成功" + "<br>" + "您的用户名:" + uname + "<br>" + "您的密码:" + pwd + "<br>"); Cookie cookieUser = new Cookie("username",uname); cookieUser.setMaxAge(60*60*24*30); response.addCookie(cookieUser); Cookie cookiePwd = new Cookie("password",pwd); cookiePwd.setMaxAge(60*60*24*30); response.addCookie(cookiePwd); HttpSession session = request.getSession(); session.setMaxInactiveInterval(10); PrintWriter writer = response.getWriter(); ServletContext servletContext = getServletContext(); Object num = servletContext.getAttribute("number"); writer.write("当前网页在线人数:"+num); } else{ System.out.println("用户名或者密码错误"); out.println("登录失败" + "<br>" + "用户名或者密码错误"); } resultSet.close(); con.close(); } catch (ClassNotFoundException e) { System.out.println("数据库驱动没有安装"); } catch (SQLException e) { System.out.println("数据库连接失败"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }

(5).最终结果

4.解决乱码问题
一般如果两个页面的编码不一样可能会导致输入的中文数据产生乱码的现象

由于我输入数据的网页用的utf-8格式 而显示数据的网页用的GB2312格式,就导致输入的中文数据乱码的现象。
要解决乱码问题就要用到过滤器
(1)在src文件夹里面创建GBFilter过滤器

(2)然后是过滤器的代码
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(filterName = "GBFilter") public class GBFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { String encoding = req.getCharacterEncoding(); System.out.println("before encoding " + encoding + " filter"); encoding = "utf-8"; req.setCharacterEncoding(encoding); resp.setContentType("text/html;charset=" + encoding); chain.doFilter(req,resp); System.out.println("after encoding " + encoding + " filter"); System.out.println("------------------------------------"); } public void init(FilterConfig config) throws ServletException { } }
(3)过滤结果

项目码云地址:https://gitee.com/xiaotiejiang329/Servlet
浙公网安备 33010602011771号