深入理解JSP 深入理解Java虚拟机
yuyutoo 2024-11-06 21:00 2 浏览 0 评论
第一章 JSP
1、概述
1.1 JSP引入
在前面的登录案例中,登录失败后为了能够响应登录的错误信息。我特意创建了一个LoginErrorServlet用来动态地拼接错误信息。
【代码如下】
- LoginErrorServlet:登录失败,手动拼接login.html页面,并将错误信息动态地添加进去。
arduino复制代码 //3.给浏览器生成响应信息
boolean result = service.login(username,password);
String msg = result ? "用户登陆成功" : "用户登陆失败";
request.setAttribute("msg",msg);
if (result){
//登陆成功
response.sendRedirect("/success.html");
}else {
//登陆失败
//转发到处理错误的servlet中
request.getRequestDispatcher("/loginErrorServlet").forward(request,response);
}
2. LoginErrorServlet:手动拼接html页面,动态展示登录错误信息。
scss复制代码@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//响应给用户
response.setContentType("text/html;charset=utf-8");
//接收错误的信息
String msg = (String) request.getAttribute("msg");
//获取输出流
PrintWriter writer = response.getWriter();
//拼接登录的html页面
response.getWriter().print("<html>");
response.getWriter().print("<body>");
response.getWriter().print("<form action='loginInterServlet' method='post'>");
response.getWriter().print(" <font style='color: red'>"+msg+"</font><br/>");
response.getWriter().print("用户名:<input type='text' name='username'/><br/>");
response.getWriter().print("密码:<input type='password' name='password'/><br/>");
response.getWriter().print("<input type='submit' value='登录'/>");
response.getWriter().print("</form>");
response.getWriter().print("</body>");
response.getWriter().print("</html>");
}
说明:上述虽然能够达到我的需求。但是他有以下两个缺点:
- 拼接麻烦开发效率低;
- 阅读性差,代码难以维护;
问题:思考既然以前在servlet有上述缺点,为什么还要使用拼接呢?
因为如果我们想在html页面显示错误的信息,我们只能采用这种方式,html页面不能够书写java代码。而我们既不采用上述拼接标签的方式,还想实现简单的效果。我们可以使用jsp技术,在jsp中可以书写java代码同时还可以书写html标签。这样 就能够使用jsp技术在客户端和服务端直接进行数据交互了。
1.2 JSP是什么
JSP全名为Java Server Pages,中文名叫java服务器页面,其本质是一个Servlet ,它是由Sun 公司倡导、许多公司参与一起建立的一种动态网页 技术标准。其实就是一个既能书写Servlet代码又能书写HTML代码的文件。
1.3 创建JSP文件
sql复制代码在web目录下,新建一个jsp文件,点击鼠标右键New --- JSP---给这个文件取个名字。
【图1 创建JSP】
文件内容如下:
javascript复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
1.4 在JSP中书写代码
jsp中既可以书写java代码,同时还可以书写html标签。我们完成练习如何在jsp页面中书写java代码。
【需求】
- 在jsp页面上获取当前日期,并将其格式化成字符串"yyyy-MM-dd HH:mm:ss";
- 将这个字符串展示在浏览器上;
说明:
1)jsp中的注释:<%--注释内容--%>,添加注释的快捷键是:ctrl+/;
2)在jsp中书写代码有三种方式,我们这里先介绍一种,格式:
<%java代码%>
【参考代码】demo01.jsp
arduino复制代码<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %><%--
Created by IntelliJ IDEA.
Date: 2018-01-09
Time: 19:15
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
jsp中的注释
【需求】
1. 在jsp页面上获取当前日期,并将其格式化成字符串"yyyy-MM-dd HH:mm:ss";
2. 将这个字符串展示在浏览器上;
--%>
<%
//获取当前系统时间
Date d = new Date();
//创建日期格式化解析器对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//使用日期格式化解析器对象调用方法格式化日期对象d
String s_date = sdf.format(d);
//控制台输出
System.out.println("s_date = " + s_date);
//将这个字符串展示在浏览器上
response.getWriter().print(s_date);
%>
</body>
</html>
【运行结果】启动tomcat,并且访问这个jsp页面。
在浏览器看到 format格式的日期:
【控制台输出】
ini复制代码s_date = 2018-01-09 19:28:22
2、JSP的运行原理
通过上面的jsp初体验, 我们看到jsp中既可以编写java代码也可以直接编写html代码,相对servlet更加方便.并且我们通过浏览器访问到的jsp页面,最后在浏览器中看到了响应到浏览器中的结果。那么整个过程的执行流程是怎样的呢,我们可以参考如下图:
通过上面的执行流程,我们可以找到jsp生成的.java源文件,这样就可以知道jsp的真正原理,同时可以看下jsp为什么是servlet。
如何查看生成的.java源文件呢?
我们可以到tomcat中查看一下上面案例中的jsp页面是怎么样的一种存在。IDEA借助tomcat发布web项目的机制:动态发布(为每一个web项目创建一个单独的发布文件)。我们可以通过tomcat其中日志中的CATALINA_BASE路径找到我们当前这个JSP页面在tomcat中的位置:
【图1 IDEA发布项目的路径】
找到这个目录后,会看到以下3个文件夹:
【图2 文件目录】
我们打开C:\Users\admin.IntelliJIdea2017.3\system\tomcat\Tomcat_8_5_311_day05目录发现有两个文件:
【图3 JSP被翻译后的代码】
打开demo01_jsp.java文件后,代码如下所示:
我们可以看到当前的jsp文件被翻译成了一个类,这个类继承HttpJspBase类,那么这个HttpJspBase类又是什么?
注意:jsp的翻译由服务器完成,HttpJspBase类一定也是tomcat服务器的内容,所以我们需要找到org.apache.jasper.runtime.HttpJspBase这个类,这个类可以到tomcat的安装目录下的lib文件夹下找到jasper.jar,将其解压,找如下目录:org\apache\jasper\runtime,找到HttpJspBase.class。
使用反编译工具打开,如下所示:
通过观察源码,根据我们所学习的继承关系,我们发现JSP其实底层就是一个servlet。通过观察源码,我们发现我们刚刚编写的所有代码都在该Servlet里面的service方法内部。
swift复制代码public final class demo01_jsp extends org.apache.jasper.runtime.HttpJspBase {
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write('\r');
out.write('\n');
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>Title</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write(" ");
out.write("\r\n");
out.write(" ");
//获取当前系统时间
Date d = new Date();
//创建日期格式化解析器对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//使用日期格式化解析器对象调用方法格式化日期对象d
String s_date = sdf.format(d);
//控制台输出
System.out.println("s_date = " + s_date);
//将这个字符串展示在浏览器上
response.getWriter().print(s_date);
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
。。。。
}
}
总结:
1.<% %>中书写的代码被直接解析成java代码;
2.jsp之所以可以编写html代码,其实本质上也是类似我们使用Servlet直接输出的。也就是说底层还是像我们之前做法一样进行标签拼接。html部分都被out.write("")方法以字符串的形式拼接,然后响应给浏览器;
3.在这个java文件中有个_jspService,这个方法有两个参数request,response;
4.由于我们自己编写的代码全部都落入到了service方法内部一开始就已经声明了request,response,session,application(ServletContext)等对象了,这些对象成为之jsp内置对象。
3、JSP中书写java代码的三种方式
在JSP页面的body标签中,可以直接书写html代码和JS代码。但是,如果在JSP页面中书写java代码。必须遵循固定的格式,才能够生效;JSP页面中书写java代码有三种方式:1.脚本片段;2.脚本声明;3.脚本表达式;
方式一:脚本片段
脚本片段指的是一段java代码。书写格式:<% java 代码 %>
【示例】 demo02.jsp
javascript复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//书写java代码,向浏览器输出数据
response.getWriter().println("hello jsp");
%>
</body>
</html>
【被翻译后的源码】
swift复制代码 out.write("\r\n");
out.write(" ");
response.getWriter().println("hello jsp");
out.write("\r\n");
【页面结果】:
方式二:脚本声明
erlang复制代码脚本片段虽然可以嵌入java代码,但是如果,我们要给当前的jsp中定义一些成员方法或者成员变量,就需要一个新的技术——脚本声明.
说明:通过查看jsp的源代码我们发现,脚本片段的代码都会存在service方法中,而方法中是不可以定义一个方法的。
脚本声明的格式:<%! 书写Java代码 %>
【示例一】声明成员变量 demo03.jsp
javascript复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%!
int num = 10;
public void method(){}
%>
</body>
</html>
【被翻译后的代码】成员变量
方式三:脚本表达式
虽然脚本声明和脚本片段已经可以书写Java代码了,但是如果我们要使用java代码向页面输出一些内容,还是需要 使用原来的response对象,比较繁琐,因此,我们需要一个更加简便的方式,可以代替response向页面输出内容 ——这个就是脚本表达式。
脚本表达式的格式:<%= 向浏览器输出的内容 %> 等价于:out.print( 向浏览器输出的内容)
【示例】在页面输出信息
bash复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%="我爱摸鱼"%>
<%="上海程序员摸鱼"%>
<%
response.getWriter().print("response");
%>
</body>
</html>
注意:
上面代码中,我们书写代码的顺序是先:
arduino复制代码<%="我爱摸鱼"%>
<%="上海程序员摸鱼"%>
再:
vbscript复制代码response.getWriter().print("response");
可是浏览器查看数据的结果是
vbscript复制代码response 我爱摸鱼 上海程序员摸鱼
原因:response.getWriter()获取的输出流是:PrintWriter。而脚本表达式<%=%> 等价于:out.print( 向浏览器输出的内容).并且这种方式获取的输出流是:JspWriter。其实导致上述输出结果前后顺序就是PrintWriter和JspWriter。
JspWriter:将输出的内容先放到jsp内置的缓冲区中,然后再刷新输出。
PrintWriter:是不使用jsp内置的缓冲区,直接将内容写到网页中。
总结:
1.不要同时使用脚本表达式和response同时往页面输出信息,会出现顺序不一致。现象:response会出现在最前面。使用一种输出即可。
2.脚本表达式<%= str %> :在页面输出内容,在service方法中起作用;
3.脚本片段<% %> :在service方法中,原样输出的代码片段;属于局部为,放在_jspService方法中
4.脚本声明:<%! String str = "程序员" %> :定义成员变量;
4、JSP的三大指令
4.1 指令概述
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出效果,而只是告诉引擎如何处理JSP页面中的其余部分。
指令用来声明JSP页面的一些属性,比如编码方式,文档类型。我们在servlet中也会声明我们使用的编码方式和响应的文档类型的,而JSP就是用指令来声明的。
【1】JSP页面的3大指令
css复制代码a) page:页面
<%@page contentType="text/html;charset=utf-8" %>
说明:声明jsp页面的编码方式
b) taglib:引入标签库
c) include:包含
【2】指令的格式
swift复制代码<%@指令名 属性名="属性值"%>
4.2 taglib指令
【作用】
复制代码用于在JSP页面中导入JSTL标签库;
【格式】
ini复制代码<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
说明:表示引入外部的jstl标签库的。
prefix="c" 表示前缀
uri="http://java.sun.com/jsp/jstl/core" 表示jstl标签库的地址
4.3 include指令
【作用】
复制代码在一个JSP页面中静态包含另外一个JSP页面;
【格式】
ini复制代码<%@include file="URL" %> 指定要导入页面的地址
【使用示例】
需求:课后的原型中的页面放到web文件夹下面。然后打开主页index.jsp.在主页中引入header.jsp页面。
xml复制代码<!--引入头部-->
<div id="header">
<%@include file="header.jsp"%>
</div>
【效果】
小结
三大指令是什么?分别的作用是?
- page:设置网页上一些属性
- taglib:导入标签库
- include:包含另一个JSP页面
5、page指令
5.1、page指令概述
【1】page指令的作用
page是jsp中必须使用的一个指令,用于设置JSP上各种页面的属性,告诉tomcat如何将一个JSP翻译成Servlet
【2】语法格式
css复制代码<%@page 属性名="属性值" %>
可以放在JSP中任何位置,一般建议放在页面的最顶部
5.2、page指令的属性
【1】导包相关属性:
ini复制代码language="java" 当前页面使用的语言,不写默认是java
import="java.util.*" 导入java.util下所有类,导包
方式一: 每个page指令导入一个类
less复制代码<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
方式二: 一个page指令的import属性导入所有的包,包之间使用逗号分隔
ini复制代码<%@page import="java.util.Date,java.text.SimpleDateFormat"%>
作用:相当于导包
【代码演示】
ini复制代码<%--<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.ArrayList" %>--%>
<%@ page import="java.util.*,java.text.SimpleDateFormat" %>
<%--
Created by IntelliJ IDEA.
Date: 2018-10-10
Time: 14:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//创建日期对象
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
ArrayList<String> list = new ArrayList<>();
%>
</body>
</html>
【2】与编码相关属性:
ini复制代码<%@ page contentType="text/html;charset=UTF-8" language="java"%>
【作用】设置响应编码
vbscript复制代码response.setContentType("text/html;charset=UTF-8");
【3】与错误相关
相关属性:
ini复制代码1、errorPage="错误页面的URL":
用于指定如果当前页面出错,转发到哪个页面去:<%@ page language="java" errorPage="error.jsp"%>
2、isErrorPage="false":默认是false,指定true表示是错误页面
当前这个页面是否是一个错误页面,错误页面可以多使用一个内置对象。exception:<%@ page isErrorPage="true"%>
错误页面跳转的3种设置:
1、通过page指令的errorPage属性指定:如果页面出错,转发到error.jsp这个页面
ini复制代码<%@ page errorPage="error.jsp"%>
代码演示:
typescript复制代码<%--跳转到错误页面--%>
<%@page errorPage="../error.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int i = 1 / 0;
%>
hello world
</body>
</html>
typescript复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--声明是错误页面--%>
<%@page isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>错误页面</h2>
<%=exception.getMessage()%>
</body>
</html>
页面效果:
2、通过web.xml文件指定错误码:响应状态码为404则跳转到404.jsp页面
如果不指定,那么按照以前报错方式,会出现如下错误页面:
我们可以在web.xml进行配置跳转到更加好看一些的页面。
xml复制代码<!-- 指定错误页面 -->
<error-page>
<!-- 指定错误码 -->
<error-code>404</error-code>
<!-- 出错以后跳转到哪个页面 -->
<location>/404.jsp</location>
</error-page>
404.jsp页面代码:
javascript复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<img src="/404.jpg"/>
</body>
</html>
3、通过web.xml文件指定错误类型:发生空指针,则跳转到null.jsp页面
xml复制代码<!-- 指定错误的类型 -->
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/null.jsp</location>
</error-page>
demo02.jsp
javascript复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String s = null;
s.length();
%>
</body>
</html>
报空指针异常后的页面:null.jsp
javascript复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>发生空指针异常了</h2>
</body>
</html>
浏览器效果:
page指令小结:
属性名 | 作用 | |
language="java" | 指定JSP页面使用语言 | |
**import="{package.class | package.*}"** | 导入包: 1. 每个import包入一个包 2. 一个import导入多个包,使用逗号分隔 |
errorPage="relative_url" | 当前页面出错,转发到哪个错误页面 | |
**isErrorPage="true | false"** | 当前是否是一个错误页面 |
contentType="mimeType [ ;charset=characterSet ]" | 指定页面类型和编码,不指定会有乱码 | |
**isELIgnored="true | false"** | 是否忽略EL表达式,true表示EL不起作用 |
javascript复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="true"%>
<html>
<head>
<title>Title</title>
</head>
<body>
${3*5}
</body>
</html>
6、JSP常用动作标签
6.1、什么是动作标签
JSP动作标签利用XML语法格式的标记来控制Servlet引擎的行为 。利用JSP动作标签可以动态包含其他jsp页面、把用户跳转到另外的页面、为Java插件生成HTML代码。
6.2、常用动作标签
JSP页面动作标签很多,常用的主要有以下3种:
makefile复制代码<jsp:include/>:动态包含
<jsp:forward/>:跳转 类似之前学习的转发技术
<jsp:param/>:参数设置
6.3、常用标签使用
【1】<jsp:include>
【作用】
复制代码用于一个JSP页面动态包含另一个JSP页面
【语法】
ini复制代码<jsp:include page="URL"/> URL是被包含的JSP页面
【使用示例】
a.jsp
javascript复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>我是A页面</h1>
<%int m1=10; %>
<!-- 静态包含: -->
<%@include file="b.jsp" %>
<!-- 动态包含 -->
<%-- <jsp:include page="b.jsp"/> --%>
</body>
</html>
b.jsp
javascript复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>我是B页面</h2>
<%int m=20; %>
</body>
</html>
【动态包含和静态包含】
静态包含include指令 | 动态包含include动作 | |
语法格式 | <%@include file="URL"%> | <jsp:include page="URL"/> |
包含的方式 | 静态包含包含的是页面的内容。如果A包含B,则先将B的页面内容复制到A页面中,再运行A页面。 B页面中不能出现与A页面同名的变量 | 动态包含包含的是页面的执行结果,如果A包含B,则先将B执行,再将B执行的结果包含到A页面中,执行A页面。 B页面中可以出现与A页面中同名的变量 |
生成Servlet个数 | 只能生成了一个Servlet | 生成了两个Servlet |
说明:
如果只是引入jsp,不需要改变,那么使用静态引入。如果引入的jsp页面是变化的,那么使用动态引入。
【2】<jsp:forward>
用于页面的转发,与request.getRequestDispatcher("/URL").foward(request,response);功能一样的
ini复制代码<jsp:forward page="URL"/> 转发
【3】<jsp:param>
用于给<jsp:forward>和<jsp:include>提供参数
ini复制代码<jsp:param value="张三" name="user"/>
forward和param动作
目标
- forward作用
- param的功能
forward
- 功能:用于转发,相当于request.getRequestDispatcher("/URL").forward(request, response)
- 语法
ini复制代码<jsp:forward page="/页面地址"/>
param
- 功能:给forward和include提供参数名和值
- 语法:做为子标签存在
- 需求:在c.jsp页面中使用转发标签forward转发到d.jsp页面。
- c.jsp页面
javascript复制代码<%--
Created by IntelliJ IDEA.
Date: 2018-10-10
Time: 16:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>c页面</h2>
<%
//解决中文乱码问题 <jsp:param name="username" value="张三"/> 是在d.jsp后面携带数据跳转到d.jsp页面的,通过浏览器的,需要先按照UTF-8编码之后在进行传递。然后在d.jsp页面使用request.getParameter("username")获取数据
request.setCharacterEncoding("UTF-8");
//向域对象request中存储数据
request.setAttribute("age",19);
%>
<%--转发动作,携带的参数,可以在d.jsp上接收这参数,通过浏览器转发过去的,所以要想获取param携带的数据必须使用getParameter()方法获取数据--%>
<jsp:forward page="d.jsp">
<jsp:param name="username" value="张三"/>
</jsp:forward>
</body>
</html>
d.jsp页面:
javascript复制代码<%--
Created by IntelliJ IDEA.
Date: 2018-10-10
Time: 16:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>d页面</h2>
<%--获取request域对象中的数据--%>
<%=request.getAttribute("age")%>
<%--获取转发param标签通过浏览器携带的数据--%>
<%=request.getParameter("username")%>
</body>
</html>
案例演示
- 从c.jsp转发到d.jsp
- c在请求域中添加键和值,d看能够得到值并且输出
- c转发的时候带参数,username和age,在d中获取并且输出
- 汉字乱码问题的解决
- 转发,url地址栏并没有发生改变
效果
小结
- forward作用:在JSP页面上实现转发
- param的功能:在转发的时候提供其它的参数名和参数值
7、JSP页面常用对象
我们发现,我们在JSP页面中书写的代码最终都会翻译到_jspService()方法中,我们发现这个方法中有两个形参:HttpServletRequest对象 ,HttpServletResponse对象 。所以说,JSP的本质就是一个Servlet。我们可以直接在JSP页面上使用这两个对象。
【需求】登录页面改造
改造登录后的页面,用户登陆失败以后,跳转到login.jsp,在jsp页面中动态显示用户登陆错误中的信息。
【思路】
- 登录失败后直接转发到一个jsp页面;
- 在jsp页面上使用request对象获取request中的值;
【LoginServlet代码】
说明:LoginServlet中,登录失败之后,直接转发到login.jsp页面。
ini复制代码protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码问题
request.setCharacterEncoding("utf-8");
//获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
UserServiceInter service = new UserServiceInterImpl();
boolean result = service.login(username,password);
String msg = result ? "用户登陆成功" : "用户登陆失败";
request.setAttribute("msg",msg);
if (result){
response.sendRedirect("/success.html");
}else {
//转发到login.jsp页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
【login.jsp页面】
xml复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>登录页面</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/login.css" rel="stylesheet">
<script src="js/jquery.js"></script>
<script src="js/bootstrap.js"></script>
</head>
<body>
<%
String msg = (String) request.getAttribute("msg");
%>
<div class="container text-center">
<form class="form-signin" action="/loginInterServlet" method="get">
<h2 class="form-signin-heading">登录页面</h2>
<font color="red"><%=msg%></font>
<input type="text" name="username" class="form-control" placeholder="用户名" required autofocus>
<input type="password" name="password" class="form-control" placeholder="密码" required>
<button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
</form>
</div>
</body>
</html>
说明:上述代码中:
css复制代码<font color="red"><%=msg%></font>
能够使用msg获取数据,因为编译之后存在于同一个类中,编译jsp如下所示:
效果图:浏览器访问login.html页面
登录密码输入错误:
小结:
- JSP作用:给浏览器生成响应信息;
- JSP特点:动态网页,html+java,由服务器来运行的。本质上是一个Servlet;
- 书写Java代码的三种方式:
- 脚本片段:java代码片段,在service方法中起作用。格式:<% System.out.println("hello") %>;
- 脚本表达式:直接在页面输出内容,在service方法中起作用,等价于out.print(内容)。格式:<%= "上海打工摸鱼"%>
- 脚本声明:定义成员变量,方法。在当前类中都起作用。<%!int a=10;%>
- JSP页面常用的对象:request,response;
相关推荐
- jQuery VS AngularJS 你更钟爱哪个?
-
在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...
- Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0
-
在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...
- 如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例
-
要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...
- 编程技巧:Jquery实时验证,指定长度的「负小数」
-
为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...
- 一篇文章带你用jquery mobile设计颜色拾取器
-
【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...
- 编程技巧:Jquery实时验证,指定长度的「正小数」
-
为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...
- jquery.validate检查数组全部验证
-
问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...
- Vue进阶(幺叁肆):npm查看包版本信息
-
第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...
- layui中使用lay-verify进行条件校验
-
一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...
- jQuery是什么?如何使用? jquery是什么功能组件
-
jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...
- django框架的表单form的理解和用法-9
-
表单呈现...
- jquery对上传文件的检测判断 jquery实现文件上传
-
总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...
- Nodejs之MEAN栈开发(四)-- form验证及图片上传
-
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...
- 大数据开发基础之JAVA jquery 大数据java实战
-
上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...
- 推荐四个开源的jQuery可视化表单设计器
-
jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)