基于Servlet实现的简单登陆练习
时间:2022-07-22
本文章向大家介绍基于Servlet实现的简单登陆练习,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
项目结构
效果演示
首先验证用户名,用户名密码正确则显示登陆成功的界面。然后记录访问次数,并且将访问访问量保存在本地文件中。而且,将编码格式配置在xml文件中,防止自己书写错误引起的编码错误的问题。
相关代码
web.xml
<?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
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
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
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
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
- 关于java传参
- 浅析ButterKnife
- SQL Server常用语句
- pyecharts(一):Python可视化利器
- 如何在Python中保存ARIMA时间序列预测模型
- SVN+Apache域用户认证配置方法_Windows(转,重新排版,部分内容更新优化)
- sum(x) over( partition by y ORDER BY z ) 分析
- Android DataBinding 数据绑定
- Flask拾遗笔记之上下文
- switch.....case....使用最容易犯错的地方
- electron 构建跨平台桌面应用
- 两个关于字符串的经典例子
- Android Wear 开发初探
- Android动态布局入门及NinePatchChunk解密
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Redis数据结构-压缩列表
- HTTP文件缓存判断流程
- Linux系统 为命令配置别名的方法
- Redis数据结构-跳跃表
- Canvas系列(10):动画初级
- Canvas系列(5):绘制文字
- 详解Keepalived安装与配置
- Redis数据结构-字典
- 编程体系结构(07):JavaEE之Web开发
- Centos 6.5环境实现本地局域网搭建YUM的方法【基于HTTP】
- Doug Lea在J.U.C包里面写的BUG又被网友发现了。
- CentOs 7.*中配置安装phpMyAdmin的完整步骤记录
- Linux中怎么通过PID号找到对应的进程名及所在目录方法
- Apache环境下配置多个ssl证书搭建多个站点的方法
- 详解Linux手动释放缓存的方法