jsp+servlet实现简单登录页面功能(附demo)
作者:Dongzfdb 发布时间:2023-09-24 11:32:28
实现功能:
模拟简单登录功能,登录成功跳转新页面,登录失败在原登录界面提示登录失败信息
开发环境:
eclipse
Tomcat-8.0
预备知识:
HTML标签,Servlet相关知识——请求的转发与重定向,jsp相关知识,EL表达式
思路实现:共2个jsp,一个servlet
1.登录界面login.jsp:
采用jsp,不采用html的原因是因为要进行登录失败信息回显(当然如果用html结合ajax也可以实现,这里采用jsp更方便)
如图:
2.登录成功界面hello.jsp:
欢迎信息+登录的用户名
如图:
3.登录失败信息回显Login.jsp:
如图:
思路简述:
问题1:jsp页面如何与一个java类进行连接绑定起来?
简单的说,一个jsp页面要跟一个servlet进行连接,需要有一个桥梁,这个桥梁就是web.xml文件,可以通过下面代码观察到,登录页面的表单的提交的action属性值,填写的就是在web.xml文件里对应的servlet-mapping中的url-pattern的值,而这个值又对应了一个servlet-name,servlet-name则对应到一个servlet-class,这样就把jsp和java类(servlet类)进行了关联。
其实我觉得最明显的就是提交表单后,url地址变化了,通过这个url地址将表单信息传给了对应的java类。
问题2:实现的整体的思路是怎么样的?
一个jsp页面通过表单元素,将用户信息通过url的形式提交给一个已经在web.xml配置映射好的servlet类,servlet类接收到传来的表单信息,进行值校验(为了方便起见则直接定义用户名密码了,正常情况下是要采用jdbc进行从数据库中取出值进行校验的),然后对校验结果进行判断,如果账户密码正确,则跳转到登录成功的页面(采用重定向),如果失败,则将登录失败的提示信息存到request域对象中并返回登录界面显示出来(采用请求的转发)
简单的联系:
jsp页面<---------->web.xml<--------->servlet类
问题3:在servlet中要如何获取jsp中提交过来的表单信息呢?
request.getParameter("userName");//userName是表单中,input标签中name属性的值,接收到的是string类型
问题4:登录页面如何在登录失败的时候给出提示信息呢?
实现思路是如果登录失败,则往request域对象中存入登录失败的提示信息,然后通过请求的转发的方式跳转回登录页面并显示,所以登录界面要嵌入一段脚本代码,用来判断当前是否有登录失败提示信息的对象,如果有则将该对象保存的信息打印出来,如果没有则什么都不显示。
1)如果账密不匹配,则往request域中存入message对象,该message中保存了提示信息:request.setAttribute("message", "账密错误,请重新登录<br>");
并转发到登录页面:request.getRequestDispatcher("/loginDemo/login.jsp").forward(request, response);
2)在登录页面获取该对象:(因为登录失败的时候才有该对象,疑问:那如果我登录失败后再访问登录页面,那不应该会显示错误信息吗?答案是否定的。可了解request域对象生命周期相关知识)
<%
if(request.getAttribute("message")!= null){
out.print(request.getAttribute("message"));
}
%>
问题5:request.getAttribute()和request.getParameter()区别是:
前者获取的是一个object对象,后者获取的是一个string字符串,所以前者使用的时候可能会碰到需要做一些类型转换的情况。
问题6:表单访问路径填写问题
在ation属性,或者请求的转发,重定向,一般采用绝对路径,可以避免路径访问出错,访问资源不存在等问题。
jsp表达式:<%=request.getContextPath()%>或者用EL表达式:${ pageContext.request.contextPath }可以获取当前web应用根目录路径,不妨试试输出打印下,就可以观察值是多少了。
具体代码Code:
1.login.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>标题</title>
<style type="text/css">
*{margin: 0;padding: 0;}
form{margin: 0 auto;padding:15px; width: 300px;height:300px;text-align: center;}
#submit{padding: 10px}
#submit input{width: 50px;height: 24px;}
</style>
</head>
<body>
<div class="wrapper">
<form action="<%=request.getContextPath()%>/loginDemo" method="post">
<label>用户名:</label>
<input type="text" name="userName" value="${param.userName}"/><br><br>
<label>密码:</label>
<input type="password" name="password"/><br>
<font color="red">
<%
if(request.getAttribute("message")!= null){
out.print(request.getAttribute("message"));
}
%>
</font>
<div id="submit">
<input type="submit" value="登录"/>
</div>
</form>
</div>
</body>
</html>
2.hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>标题</title>
</head>
<body>
Hello:<br>
<font color="green" size="22">
<%
out.print(request.getParameter("userName")+"<br>");
%>
</font>
<a href="<%=request.getContextPath()%>/loginDemo/login.jsp">重新登录</a>
</body>
</html>
3.对应的LoginServlet.java
package loginDemo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName = request.getParameter("userName");
String password = request.getParameter("password");
System.err.println(userName+";"+password);
String myUser = "Dong";
String myPwd = "5432100";
if(userName.equals(myUser)&&password.equals(myPwd)) {
response.sendRedirect(request.getContextPath()+"/loginDemo/hello.jsp?userName="+userName);
}else {
request.setAttribute("message", "账密错误,请重新登录<br>");
request.getRequestDispatcher("/loginDemo/login.jsp").forward(request, response);
}
}
}
4.对应的web.xml的配置(注册)与映射
<servlet>
<servlet-name>logindemo</servlet-name>
<servlet-class>loginDemo.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>logindemo</servlet-name>
<url-pattern>/loginDemo</url-pattern>
</servlet-mapping>
来源:https://blog.csdn.net/qq_37306786/article/details/80484200


猜你喜欢
- 1、JDK1.8之前:假设有实体类User,里面有字段id,我们将相同id的User进行分组,并存放在Map中。(例子不是很恰当,但很能说明
- 在使用Mybatis时,有的时候我们可以不用定义resultMap,而是直接在<select>语句上指定resultType。这
- 1.静态成员、实例成员1.1定义及说明数据成员:静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是一个
- SpringBoot线程池和Java线程池的用法和实现原理使用默认的线程池方式一:通过@Async注解调用public class Asyn
- 向量向量是序列容器,表示可以更改大小的数组。就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来
- 下面提供代码示例,请参考。public boolean onKeyDown(int keyCode, KeyEvent event) {&n
- 服务提供者@GetMapping("/{id}") public void queryJobInfoLogD
- 1、ThreadLocal 使用原理前文我们讲过ThreadLocal的主要用途是实现线程间变量的隔离,表面上他们使用的是同一个Thread
- 一、项目简述(+需求文档+PPT)功能: 主页显示热销商品;所有商品展示,可进行商品搜索;点 击商品进入商品详情页,显示库存,具有立即购买和
- 本文实例为大家分享了android实现点击按钮控制图片切换的具体代码,供大家参考,具体内容如下代码:class MainActivity :
- 使用匿名内部类课使代码更加简洁、紧凑,模块化程度更高。内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到。然而这
- 一、项目简述本系统功能包括:分为前端翻后端部分,包括用户,区分晋通用户以及誉里员用户,包括首页展示,部门管理,人事管理,员工管理三个模块等等
- 本文实例讲述了Android测量每秒帧数Frames Per Second (FPS)的方法。分享给大家供大家参考。具体如下:MainThr
- 简介optional类是java8中引入的针对NPE问题的一种优美处理方式,源码作者也希望以此替代null。历史1965年,英国一位名为To
- Java基础之理解Annotation一、概念 Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一
- 当CLR未能分配所需的足够内存时,将发生System.OutOfMemoryException。System.OutOfMemoryExce
- 1,什么是字符编码? 字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。一组
- 前言什么是语法糖?(语法糖就是像糖一样的语法…)语法糖(Syntactic sugar),又名糖衣语法,最早是由英国计算机科学家彼得·约翰·
- 命令行编译java文件import java.util.*;public class shuchu{ public
- 实现说明这里的核心在于如何在大并发的情况下保证数据库能扛得住压力,因为大并发的瓶颈在于数据库。如果用户的请求直接从前端传到数据库,显然,数据