【请求重定向sendRedirect】【请求转发getRequestDispatcher】【JSP页面详解】
登录功能实现-页面中错误提示涉及的技术知识点请求重定向请求转发jsp页面EL表达式登录失败提示效果实现请求重定向sendRedirectServlet接收到浏览器端请求并处理完成后,给浏览器端一个特殊的响应,这个特殊的响应要求浏览器去请求一个新的资源,整个过程中浏览器端会发出两次请求,且浏览器地址栏会改变为新资源的地址。重定向的情况下,原Servlet和目标资源之间就不能共享请求域数据了实现重定向
登录功能实现-页面中错误提示
涉及的技术知识点
- 请求重定向
- 请求转发
- jsp页面
- EL表达式
- 登录失败提示效果实现
请求重定向sendRedirect
-
Servlet接收到浏览器端请求并处理完成后,给浏览器端一个特殊的响应,这个特殊的响应要求浏览器去请求一个新的资源,整个过程中浏览器端会发出两次请求,且浏览器地址栏会改变为新资源的地址。
-
重定向的情况下,原Servlet和目标资源之间就不能共享请求域数据了
-
实现重定向的API
服务器会给浏览器发送一个302状态码以及一个新的地址。
请求转发getRequestDispatcher
-
Servlet接收到浏览器端请求后,进行一定的处理,先不进行响应,而是在服务器端内部“转发”给其他Servlet程序继续处理。在这种情况下浏览器端只发出了一次请求,浏览器地址栏不会发生变化,用户也感知不到请求被转发了。
-
转发请求的Servlet和目标Servlet共享同一个request对象。
-
实现转发的API
重定向与转发的区别
转发 | 重定向 | |
---|---|---|
浏览器地址栏 | 不改变 | 改变 |
发送请求次数 | 1 | 2 |
能否共享request对象数据 | 能 | 否 |
目标资源:WEB-INF下的资源 | 能访问 | 不能访问 |
Request中绑定的数据是否可以传递 | 能 | 不能 |
JSP页面
-
JSP全称Java Server Pages,顾名思义就是运行在java服务器中的页面,也就是在我们JavaWeb中的动态页面,其本质就是一个Servlet。
-
其本身是一个动态网页技术标准,它的主要构成有HTML网页代码、Java代码片段、JSP标签几部分组成,后缀是.jsp
-
相比于Servlet,JSP更加善于处理显示页面,而Servlet跟擅长处理业务逻辑,两种技术各有专长,所以一般我们会将Servlet和JSP结合使用,Servlet负责业务,JSP负责显示。
-
一般情况下, 都是Servlet处理完的数据,转发到JSP,JSP负责显示数据的工作。
-
Jsp页面的执行原理:
Jsp本质上就是一个servlet,执行的时候会先转化成一个.java文件,在编译成.class文件。
如何转化:java代码片段照搬
html、css、js表达式通过输出流out.write()方法往出写。
-
Jsp作用:
可以自动的将html相关的代码通过流写到浏览器端。
支持写java代码,可以灵活的做出一些处理。
-
JSP的基本语法:
<%-- Created by IntelliJ IDEA. User: kuber Date: 2020/10/26 Time: 22:14 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录</title> <meta charset="UTF-8"> <style> body{ background-color:pink; } span{ color:red; } </style> <script> function clear_msg(){ var ele = document.getElementById("loginErr_msg"); ele.innerHTML = ""; } </script> </head> <!--<body bgcolor="pink"> --> <body bgcolor="pink"> <h1>欢迎登录</h1> <form action="login" method="post"> 用户名称 :<input type="text" name="username" οnfοcus="clear_msg();"/> <span id="loginErr_msg" >${requestScope.loginError_msg}</span> <%--<% String loginMsg = (String) request.getAttribute("loginError_msg"); %> <span><%=loginMsg==null?"":loginMsg%></span>--%> <br/> 用户密码 :<input type="password" name="password"/> <br/> <input type="submit" value="Login"/> </form> </body> </html>
-
JSP的脚本元素
脚本片段是嵌入到JSP中Java代码段,格式以<%开头,%>结尾,两个%号之间就可以编写Java代码了
-
JSP的表达式
JSP表达式用来直接将Java变量输出到页面中,格式以<%=开头,以%>结尾,中间是我们要输出的内容
-
JSP的隐含对象
- out(JspWriter):相当于response.getWriter()获取的对象,用于在页面中显示信息。
- config(ServletConfig):对应Servlet中的ServletConfig对象。
- page(Object):对应当前Servlet对象,实际上就是this。
- pageContext(PageContext):当前页面的上下文,也是一个域对象。
- exception(Throwable):错误页面中异常对象
- request(HttpServletRequest):HttpServletRequest对象
- response(HttpServletResponse):HttpServletResponse对象
- application(ServletContext):ServletContext对象
- session(HttpSession):HttpSession对象
1,6,7,8,9常用,要记住。
-
EL表达式
-
EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。EL在得到某个数据时,会自动进行数据类型的转换。
-
EL表达式用于代替JSP表达式(<%= %>)在页面中做输出操作。
-
EL表达式仅仅用来读取数据,而不能对数据进行修改。
-
使用EL表达式输出数据时,如果有则输出数据,如果为null则什么也不输出。
-
EL表达式的语法:
-
EL取值的四个域:
pageScope
requestScope
sessionScope
applicationScope
-
使用el表达式主要用于取值。
-
页面中错误提示的功能效果
实现的功能是,用户在提交登陆后,服务器端会判断用户密码是否正确,若不正确,随后浏览器端刷新页面,给出提示。
/*
* 处理登录请求的servlet
* */
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
System.out.println("登录请求过来了...");
req.setCharacterEncoding("utf-8");/*一定要在获取之前加*/
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("账号为"+username);
System.out.println("密码为"+password);
resp.setContentType("text/html;charset=utf-8");/*一定要在获取流之前加*/
PrintWriter out = resp.getWriter();
UserDao userDao = new UserDaoImpl();
User user = userDao.getUserByUsernameAndPassword(username, password);
if(user == null){
/*out.println("<h1><font color='red'>Login Fail登陆失败</font></h1>");*/
/*通过重定向的方式前往登录页面
* 服务器会给浏览器发送一个302状态码以及一个新的地址
* 也就是说客户端会有2次请求
* */
//resp.sendRedirect("login.jsp");
/*转发实现错误界面的跳转*/
req.setAttribute("loginError_msg","用户名或者密码错误");
RequestDispatcher rd = req.getRequestDispatcher("login.jsp");
try {
rd.forward(req,resp);
} catch (ServletException e) {
e.printStackTrace();
}
}else {
// out.println("<h1><font color='blue'>Login Success登陆成功</font></h1>");
/*通过session存储user*/
HttpSession session = req.getSession();
/*session.setAttribute("loginUser",user.getUsername());*/
session.setAttribute("loginUser",user);
// resp.sendRedirect("main.jsp");
/*查询所有员工数据*/
// ArrayList<Employee> objects = new ArrayList<>();
EmployeeDaoImpl employeeDao = new EmployeeDaoImpl();
List<Employee> emps = employeeDao.getEmployee();
req.setAttribute("emps",emps);
req.getRequestDispatcher("main.jsp").forward(req,resp);
}
/*if("Admin".equalsIgnoreCase(username) && "111111".equals(password)){
out.println("<h1><font color='blue'>Login Success登陆成功</font></h1>");
}else {
out.println("<h1><font color='red'>Login Fail登陆失败</font></h1>");
}*/
}
}
<%--
Created by IntelliJ IDEA.
User: kuber
Date: 2020/10/26
Time: 22:14
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
<meta charset="UTF-8">
<style>
body{
background-color:pink;
}
span{
color:red;
}
</style>
<script>
function clear_msg(){
var ele = document.getElementById("loginErr_msg");
ele.innerHTML = "";
}
</script>
</head>
<!--<body bgcolor="pink"> -->
<body bgcolor="pink">
<h1>欢迎登录</h1>
<form action="login" method="post">
用户名称 :<input type="text" name="username" οnfοcus="clear_msg();"/>
<span id="loginErr_msg" >${requestScope.loginError_msg}</span>
<%--<%
String loginMsg = (String) request.getAttribute("loginError_msg");
%>
<span><%=loginMsg==null?"":loginMsg%></span>--%>
<br/>
用户密码 :<input type="password" name="password"/>
<br/>
<input type="submit" value="Login"/>
</form>
</body>
</html>
更多推荐
所有评论(0)