前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Servlet实现的简单登陆练习

基于Servlet实现的简单登陆练习

作者头像
时间静止不是简史
发布2020-07-26 00:15:43
4560
发布2020-07-26 00:15:43
举报
文章被收录于专栏:Java探索之路Java探索之路

项目结构

在这里插入图片描述
在这里插入图片描述

效果演示

首先验证用户名,用户名密码正确则显示登陆成功的界面。然后记录访问次数,并且将访问访问量保存在本地文件中。而且,将编码格式配置在xml文件中,防止自己书写错误引起的编码错误的问题。

在这里插入图片描述
在这里插入图片描述

相关代码

web.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 <!-- 配置全局属性,对请求和响应的编码格式进行配置 -->
   <context-param>
   		<param-name>reqcode</param-name>
   		<param-value>utf-8</param-value>
   </context-param>
   <context-param>
   		<param-name>repscode</param-name>
   		<param-value>text/html;charset=utf-8</param-value>
   </context-param>
   
  <display-name>12Login</display-name>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.bjsxt.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>UserServlet</servlet-name>
    <servlet-class>com.bjsxt.servlet.UserServlet</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>MainServlet</servlet-name>
    <servlet-class>com.bjsxt.servlet.MainServlet</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>NumServlet</servlet-name>
    <servlet-class>com.bjsxt.servlet.NumServlet</servlet-class>
	
	<load-on-startup>1</load-on-startup><!-- 配置Servlet服务器启动加载 -->
  </servlet>

  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <url-pattern>/user</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern>/main</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>NumServlet</servlet-name>
    <url-pattern>/num</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

LoginServlet.java

代码语言:javascript
复制
package com.bjsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//获取SevletContext对象
		ServletContext sc = this.getServletContext();
		//获取共享数据
		String reqc = (String) sc.getInitParameter("reqcode");
		String respc = (String) sc.getInitParameter("repscode");
		
		//设置请求编码格式
		req.setCharacterEncoding(reqc);
		//设置响应编码格式
		resp.setContentType(respc);
		//获取session对象
		HttpSession session = req.getSession();
		String str= (session.getAttribute("flag")==null?"":"用户名或密码错误");
		session.invalidate();
		//获取请求信息
		//处理请求信息
		//相应处理结果
			//直接响应
		resp.getWriter().write("<html>");
		resp.getWriter().write("<head>");
		resp.getWriter().write("</head>");
		resp.getWriter().write("<body>");
		resp.getWriter().write("<form action='user' method='post'>");
		resp.getWriter().write("<font color='red'>"+str+"</font><br />");
		resp.getWriter().write("用户名:<input type='text' name='uname' /><br />");
		resp.getWriter().write("密码: <input type='password' name='pwd' /><br />");
		resp.getWriter().write("<input type='submit' value='登陆'>");
		resp.getWriter().write("</form>");
		resp.getWriter().write("</body>");
		resp.getWriter().write("</html>");
	}
}

UserServlet .java

代码语言:javascript
复制
package com.bjsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class UserServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//获取SevletContext对象
		ServletContext sc = this.getServletContext();
		//获取共享数据
		String reqc = (String) sc.getInitParameter("reqcode");
		String respc = (String) sc.getInitParameter("repscode");
		
		//设置请求编码格式
		req.setCharacterEncoding(reqc);
		//设置响应编码格式
		resp.setContentType(respc); 
		//获取请求信息
		
		//处理请求信息
		String uname=req.getParameter("uname");
		String pwd=req.getParameter("pwd");
		if ("gaoqi".equals(uname)&&"123456".equals(pwd)) {
			
			//登陆成功
				//获取servletContext对象
				 //ServletContext sc = this.getServletContext();
				//从sc对象中获取计数器,没有就创建
				 Object obj = sc.getAttribute("nums");
				//判断
				 if (obj!=null) {
					//计数器自增
					 int nums=(int) obj;
					 nums++;
					 //存储计数器数据到servletContext对象上
			    	 sc.setAttribute("nums", nums);
				}else {
					 sc.setAttribute("nums", 1);
				}
			
			//创建session对象,获取用户名信息
			HttpSession hs = req.getSession();
			//hs是一个map,即键值对的集合,键名需要加引号,后来使用键名获取值时也要加引号
			hs.setAttribute("uname", uname);
			//响应处理结果
			resp.sendRedirect("main");
			
		}else {
			//登录失败
			
			//创建session并增加登陆失败标记
			HttpSession session = req.getSession();
			session.setAttribute("flag", "loginfalse");
			//响应处理结果
			resp.sendRedirect("login");
		}
		
		
	}
}

MainServlet .java

代码语言:javascript
复制
package com.bjsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MainServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//获取SevletContext对象
		ServletContext sc = this.getServletContext();
		//获取共享数据
		String reqc = (String) sc.getInitParameter("reqcode");
		String respc = (String) sc.getInitParameter("repscode");
		
		//设置请求编码格式
		req.setCharacterEncoding(reqc);
		//设置响应编码格式
		resp.setContentType(respc);
		//获取请求信息
			//获取servletContext对象
			//ServletContext sc = this.getServletContext();
			//获取计数器数据
			Object nums = sc.getAttribute("nums");
		//处理请求信息
		//响应请求结果
			//直接响应
			resp.getWriter().write("<html>");
			resp.getWriter().write("<head>");
			resp.getWriter().write("</head>");
			resp.getWriter().write("<body>");
			resp.getWriter().write("<h2>"+"欢迎"+req.getSession().getAttribute("uname")+"进入时间静止不是简史的博客"+"</h2>");
			resp.getWriter().write("<hr />");
			resp.getWriter().write("当前网页访问次数为:"+nums);
			resp.getWriter().write("</body>");
			resp.getWriter().write("</html>");
			
			//请求转发
			//重定向
	}
}

NumServlet .java

代码语言:javascript
复制
package com.bjsxt.servlet;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class NumServlet extends HttpServlet {

	//在服务器启动时将num.txt中的数据存储到ServletContext中去
	public void init() throws ServletException {
		
		//获取ServletContext对象
		ServletContext sc = this.getServletContext();
		//获取num.txt中存储的浏览器浏览的次数
			//获取nums.txt的绝对路径
			String path = sc.getRealPath("num/nums.txt");
			//创建File对象
			File f = new File(path);
			//读取nums.txt中的数据
			//获取资源流对象
			FileInputStream fis=null;
			InputStreamReader isr=null;
			BufferedReader br=null;
			
			try {
				fis=new FileInputStream(f);
				isr=new InputStreamReader(fis);
				br=new BufferedReader(isr);
				
				//读取
				String nums = br.readLine();
				//将数据存储到ServletContext中
				sc.setAttribute("nums", Integer.parseInt(nums));
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				try {
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
	}
	
	
	//在服务器关闭的时候,将nums.txt中的数据存储到servletContext中
	public void destroy() {
		//获取ServletContext对象
		ServletContext sc = this.getServletContext();
		//获取计数器数据
		int nums = (int) sc.getAttribute("nums");
		//将计数器数据存储到nums.txt文件中
			//获取nums.txt的绝对路径
			String path = sc.getRealPath("num/nums.txt");
			//获取file对象
			File f = new File(path);
			//获取资源流对象
			FileOutputStream fos=null;
			OutputStreamWriter osw=null;
			BufferedWriter bw=null;
			try {
				fos=new FileOutputStream(f);
				osw = new OutputStreamWriter(fos);
				bw = new BufferedWriter(osw);
				
				//将数据写入到num.txt中
				bw.write(nums+"");
				bw.flush();
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				try {
					bw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				try {
					osw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
	}



}

源码分享: 链接:https://pan.baidu.com/s/1LNtaEn7RgceO1Zez9DyLRA 提取码:w739

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-04-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目结构
  • 效果演示
  • 相关代码
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档