C03_D01_UseJsp1
calculate.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>计算结果</title>
</head>
<body>
<br>
<%
double a=Double.parseDouble(request.getParameter("num1"));
double b=Double.parseDouble(request.getParameter("num2"));
double result=a/b;
%>
<h1 style="color: green;">计算结果:<%=result%> </h1>
</body>
</html>
C03_D02_UseJsp2
CalculateServlet
package com.qdu.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/cs")
public class CalculateServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 获取请求参数
double num1=Double.parseDouble(req.getParameter("num1"));
double num2=Double.parseDouble(req.getParameter("num2"));
//2. 调用业务逻辑
double result=num1/num2;
//3. 显示响应
//如果servlet产生了一些数据,需要共享给下个组件(servlet或jsp)
//可以考虑将数据放入请求对象,然后转发请求即可
req.setAttribute("jieguo", result);
//获取请求转发器,指定转发目标是result.jsp,调用forward转发当前请求对象和响应对象
req.getRequestDispatcher("/result.jsp").forward(req, resp);
}
}
result.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>计算结果</title>
</head>
<body>
<h1 style="color:red;">计算结果: ${jieguo} </h1>
</body>
</html>
test.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测运用JSP页面</title>
</head>
<body>
<h1>测运用JSP页面!!!</h1>
<hr>
<%
int a=10;
int b=20;
int c=a+b;
%>
<p>哈哈哈</p>
<%
for(int i=0;i<10;i++)
out.println("<br>呵呵呵");
%>
<p>嘎嘎嘎</p>
<hr>
<p>呵呵呵呵呵呵呵呵呵呵呵呵和</p>
</body>
</html>
style.css
h1{
text-align: center;
color: lightcoral;
}
table{
border-spacing: 20px;
}
input{
padding: 5px 10px;
outline: none;
border-radius: 5px;
border: solid lightblue 1px;
}
input[type="submit"]{
background-color: darkcyan;
border: none;
color: white;
}
input[type="submit"]:hover{
background-color: brown;
cursor: pointer;
}
p{
color: darkgreen;
}
C03_D03_UseJsp3
index.jsp
<!DOCTYPE html>
<html>
<head>
<title>首页</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/style.css"/>
</head>
<body>
<h1>JSP页面组件</h1>
<hr>
<ul>
<li><a href="jsp指令.jsp">jsp指令</a></li>
<li><a href="jsp脚本元素.jsp?name=anna">jsp脚本元素</a></li> <!--传递一个参数下一个jsp页面用-->
<li><a href="jsp隐式对象.jsp?name=anna">jsp隐式对象</a></li> <!--传递一个参数下一个jsp页面用-->
<li><a href="jsp动作.jsp?name=anna">jsp动作</a></li> <!--传递一个参数下一个jsp页面用-->
</ul>
</body>
</html>
<%--
主题: jsp指令
这是JSP注释,客户端看不见
--%>
<!--taglib用于引入一个标记库,uri指定该标记库的名称,prefix用于指定标记库的别名(随便起),我们用别名使用标记库中的标记-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Random"%>
<%@page import="java.util.Date"%>
<!--这是html注释,客户端可以看见,通过查看网页源代码就可以查看-->
<%--<%@page 指令属性名="指令的属性值" ..... %>--%>
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<!--可以使用page指令多次,用于定义不同的属性-->
<%@page language="java" %>
<!--如果还没有会话对象,去访问一个session属性设置为true的jsp页面,会导致创建一个会话对象-->
<%@page session="true" %>
<!--buffer用于设置响应的缓冲区大小,autoFlush设置是否自动清空缓冲区,清空缓冲区导致缓冲区内容输出到客户端-->
<%@page buffer="8kb" autoFlush="true" %>
<!--isThreadSafe属性用于设置转换成的servlet应用的线程模型,true表示多线程模型,false表示单线程模型-->
<%@page isThreadSafe="true" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP指令</title>
<script src="js/jquery-3.3.1.min.js"></script>
<script src="js/script.js"></script>
<link rel="stylesheet" href="css/style2.css"/>
</head>
<body>
<h1>jsp指令</h1>
<hr>
<div class="container">
<h3>1. page指令</h3>
<div class="brown content">
<h4>* page指令用于设置需要通知给web容器的信息,也就是页面的一些全局信息</h4>
<h4>* page指令的属性:</h4>
<div class="inner-content">
*(1) contentType:设置页面的响应内容的MIME类型,也就是内容类型<br>
*(2) pageEncoding:页面编码,设置页面的响应内容的编码<br>
*(3) language: 语言,指定页面的脚本语言,jsp一般使用java<br>
*(4) import: 导入使用的java类,导包<br>
*(5) extends: 指定当前jsp转成的servlet继承的父类的全限定类名<br>
*(6) session: 指定在当前页面是否获取会话对象,默认是true,获取会话对象<br>
如果设置为false,则不能在页面上使用session这个隐式对象<br>
如果访问当前jsp的时候,还没有会话,而且session属性设置为true,则会创建会话<br>
*(7) isThreadSafe: 是否是线程安全的,true是使用多线程模型,false是使用单线程模型,默认值是true<br>
</div>
</div>
<%
Date riqi=new Date();
Random rand=new Random();
//SimpleDateFormat提供一些方法格式化日期的格式
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
String now=sdf.format(riqi); //按照指定的格式格式化日期,以字符串形式返回结果
%>
<p>日期:<%=now%></p>
<h3>2. taglib指令</h3>
<h4 class="brown content">* taglib指令用于引入使用的标记库</h4>
<%
for(int i=1;i<=5;i++)
out.println("<p>哈哈哈</p>");
%>
<c:forEach begin="1" end="6">
<p style="color:red;">呵呵呵呵呵呵</p>
<hr>
</c:forEach>
<h3>3. include指令</h3>
<h4 class="brown content">* include指令用于将其他页面包含到当前页面中,file指定要包含的页面</h4>
<%@include file="menu.html" %>
</div>
<br>
<!--
Ajax: 一种技术,用于实现页面的局部刷新
这里调用jQuery提供的ajax函数发送了一个ajax请求给url为logout的Servlet
请求结束会话, 这里点击超链接执行js,所以不会刷新页面
-->
<a class="logout" href="javascript:$.ajax('logout');">结束会话</a>
</body>
</html>
jsp脚本元素.jsp
<%--
主题: jsp脚本元素
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP脚本元素</title>
<link rel="stylesheet" href="css/style.css"/>
</head>
<body>
<h1>JSP脚本元素</h1>
<hr>
<div class="container">
<!--JSP脚本元素用于在jsp页面嵌入java代码-->
<h3>1. java代码段(也就是scriptlet)</h3>
<!--<p class="strong">***在页面上编写的java代码段和java表达式的内容都会被封装到转成的servlet的_jspService()方法中</p>-->
<%
int a=10;
int b=20;
int c=a+b;
%>
<%
for(int i=0;i<5;i++){
out.println("<p>姑娘,你好!</p>");
}
%>
<%
for(int i=0;i<5;i++){
%>
<p style="color:red;">呵呵</p>
<%
}
%>
<hr>
<h3>2. java表达式,用于直接将值插入到输出中,后面不要加分号,后面不要加分号,后面不要加分号</h3>
<!--<p>表达式中可使用:*1.变量 *2.调用一个方法(方法需要有返回值) *3.常规表达式 如1+1</p>-->
<p>使用变量:<%=a%></p>
<p>调用方法,方法需要有返回值:<%=Math.ceil(10.5)%></p>
<p>常规表达式:<%=1+1%></p>
<hr>
<h3>3. java声明:用于声明全局变量和类中方法</h3>
<p class="strong">***隐式对象只能在java代码段和java表达式中使用,在java声明中不可以使用隐式对象,因为隐式对象都是在_jspService()方法中定义的,而java代码段和java表达式的内容会封装到_jspService()方法中,所以可以使用隐式对象。</p>
<%!
int x=100;
public void sayHi(){
System.out.println("Hi");
}
%>
</div>
</body>
</html>
<%--
主题: jsp隐式对象
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP隐式对象</title>
<link rel="stylesheet" href="css/style.css"/>
</head>
<body>
<h1>JSP隐式对象</h1>
<hr>
<div class="container">
<h3>隐式对象:是一些特定的预定义的变量,可在JSP页面上(jsp代码段和jsp表达式)直接使用</h3>
<p>1. request: 请求对象,封装发来的请求信息</p>
<p>2. response: 响应对象,包含响应信息</p>
<p>3. out: 用于在页面动态输出内容的对象</p>
<p>4. application: 当前应用程序的ServletContext对象 </p>
<p>5. page: 当前页面对象</p>
<p>6. session: 当前的会话对象,通过getSession()获取的</p>
<p>7. config : jsp转成servlet后对应的ServletConfig对象</p>
<p>8. pageContext: 当前页面的上下文对象,可用于存储页面范围数据,也可用于获取其他隐式对象或对页面做一些操作,如请求转发</p>
<p>9. exception: 异常对象,只有错误页面可以用,也就是isErrorPage属性设为true的页面</p>
<hr>
<!--为了在不同范围共享数据,我们提供了一些不同域范围-->
<!--如果想在四个范围共享数据,调用域对象的setAttribute()方法以名称-值对的形式放入对应的域对象即可-->
<h3>四个域对象: application>session>request>pageContext </h3>
<p>
<br>application: 应用程序范围,将数据放入application对象(就是上下文对象)
<br>session: 会话范围,将数据放入session对象(就是会话对象)
<br>request: 请求范围,将数据放入request对象(就是请求对象)
<br>page: 页面范围,将数据放入pageContext对象(就是页面上下文对象)
</p>
<br>
<p style="color: darkslategrey;">A. 可使用java表达式获取域对象中的属性</p>
<p>
<br>页面范围属性:
<br>请求范围属性:
<br>会话范围属性:
<br>程序范围属性:
</p>
<p style="color: darkslategrey;">B. 也可使用EL表达式获取域对象中的属性</p>
<p>
<br>页面范围属性:
<br>请求范围属性:
<br>会话范围属性:
<br>程序范围属性:
</p>
</div>
</body>
</html>
<%--
主题: jsp动作(jsp action)
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP动作</title>
<link rel="stylesheet" href="css/style.css"/>
</head>
<body>
<h1>JSP动作</h1>
<hr>
<div class="container">
<h3>JSP动作:JSP动作用于执行一些特殊任务,如使用javabean,转发请求等</h3>
<p>请求参数:<%=request.getParameter("name")%></p>
<%
//A调用forward转发请求给B,A和B都是处理同一个请求,最后显示B的内容
//A调用include转发请求给B,A和B都是处理同一个请求,最后显示A+B的内容,将B的内容包含到A中一起显示
%>
<%--使用jsp动作语法--%>
<p>用于从当前页面foward方式转发请求给指定的页面</p>
<p>用于从当前页面include方式转发请求给指定的页面</p>
</div>
</body>
</html>
LogoutSerlvet
package com.qdu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/logout")
public class LogoutSerlvet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如果有会话,结束会话
HttpSession session = req.getSession(false);
if (session != null) {
session.invalidate();
}
}
}
MySessionListener
package com.qdu.listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener //等效于在web.xml中注册监听器
public class MySessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session创建............."+se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session摧毁.............."+se.getSession().getId());
}
}
h1{
text-align: center;
color: lightcoral;
}
ul{
list-style: none;
padding: 0;
}
a{
display: block;
width: 200px;
height: 40px;
line-height: 40px;
margin: 30px auto;
background-color: darkcyan;
color: white;
text-align: center;
text-decoration: none;
}
a:hover{
text-decoration: underline;
background-color: brown;
}
.container{
padding: 30px;
background-color: lightgoldenrodyellow;
}
.container h3{
color: darkcyan;
}
.container p{
color: brown;
padding-left: 23px;
}
.strong{
color: brown;font-style: italic;font-weight: bold;
}
body{
font-family: 微软雅黑;
}
.brown{
color:brown;
}
.strong{
font-weight: bold;
color: darkcyan;
}
p{
padding-left: 20px;
}
.content{
padding-left:30px;
}
.inner-content{
padding-left: 60px;
color: darkgreen;
}
h4{
margin:5px;
}
.logout{
background-color: darkcyan;
text-decoration: none;
border-radius: 5px;
padding: 7px 10px;
color: white;
position: fixed;
top: 40px;
right: 120px;
}
.logout:hover{
background-color: brown;
text-decoration: underline;
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<jsp-config>
<jsp-property-group>
<description>设置html页面的编码,如果发现html出乱码了,使用该设置</description>
<display-name>htmlEncoding</display-name>
<url-pattern>*.html</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
</web-app>
C03_D04_Jsp_ErrorPage
<!--可以为单个jsp页面指定错误页面-->
<%@page errorPage="errorPage.jsp" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>计算</title>
</head>
<body>
<%
int num1=Integer.parseInt(request.getParameter("num1"));
int num2=Integer.parseInt(request.getParameter("num2"));
int result=num1/num2;
%>
<h1>计算结果:<%=result%></h1>
</body>
</html>
<!--作为错误页面的页面需要将page指令的isErrorPage属性设置为true,这样可以在该页面获取错误和异常信息-->
<%@page isErrorPage="true" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误页面</title>
<link rel="stylesheet" href="css/style.css"/>
</head>
<body>
<h1 class="warning">错误页面-程序出现了异常!</h1>
<hr>
<%
//如果页面B是A的错误页面,那么当A发生异常的时候
//会自动传一个异常对象给到B,包含异常信息
//exception隐式对象只能在错误页面使用,该对象包含异常信息
out.println("<br>异常类型:"+exception.getClass());
out.println("<br>异常消息:"+exception.getMessage());
out.println("<br>异常对象:"+exception);
%>
<br>
<br>
<hr>
<%
//获取更多错误信息,从pageContext对象中获取ErrorData对象
//如果要获取更多错误信息,如错误代码等信息,获取ErrorData对象
ErrorData ed=pageContext.getErrorData(); //用于获取页面信息和其他对象
out.println("<br>请求的URI:"+ed.getRequestURI());
out.println("<br>状态代码:"+ed.getStatusCode());
out.println("<br>异常对象:"+ed.getThrowable());
%>
<br>
<br>
<hr>
</body>
</html>