servlet 生命周期(从生命开始到结束,人也有生命周期-生老病死)
init()-->service()[doGet / doPost] -->destroy()
触发时间:
init方法:第一次servlet被调用或servlet设置了<load-on-startup>1</load-on-startup>的时候则在启动的时候被启动(只执行一次)
service方法:每次接受到请求的时候被调用
destroy方法:servlet被销毁的时候被调用Tomcat被关闭的时候(只执行一次)
JSP概述
- JSP是一个模版引擎框架
- JSP全称Java Server Pages,是SUN公司定义的一种用于开发动态WEB资源的技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头 %>结束。
- jsp适合编写输出动态内容,但不适合编写java逻辑。
- jsp的本质:JSP本质是Servlet,jsp页面先经过翻译阶段,把jsp文件翻译成Java文件(这个Java文件其实就是Servlet),再由系统编译成Java类文件(.class文件)。
jsp语法
- 声明语法
<%! 声明属性片段 %> - 代码语法
<% 代码片段 %> - <%=“12465” >
- 指令语法
<%@ include … %> 包含其他文件
<%@ page … %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ taglib … %> 引入标签库的定义
jsp九大内置对象(不需要自己创建、不需要自己定义的)
- Request(Javax.servlet.ServletRequest)它包含了有关浏览器请求的信息.通过该对象可以获得请求中的头信息、Cookie和请求参数。
- Response(Javax.servlet.ServletResponse)作为JSP页面处理结果返回给用户的响应存储在该对象中。并提供了设置响应内容、响应头以及重定向的方法(如cookies,头信息等)
- Out(Javax.servlet.jsp.JspWriter)用于将内容写入JSP页面实例的输出流中,提供了几个方法使你能用于向浏览器回送输出结果。
- pageContext(Javax.servlet.jsp.PageContext)描述了当前JSP页面的运行环境。可以返回JSP页面的其他隐式对象及其属性的访问,另外,它还实现将控制权从当前页面传输至其他页面的方法。
- Session(javax.servlet.http.HttpSession)会话对象存储有关此会话的信息,也可以将属性赋给一个会话,每个属性都有名称和值。会话对象主要用于存储和检索属性值。
- Application(javax.servle.ServletContext)存储了运行JSP页面的servlet以及在同一应用程序中的任何Web组件的上下文信息。
- Page(Java.lang.Object)表示当前JSP页面的servlet实例
- Config(javax.servlet.ServletConfig)该对象用于存取servlet实例的初始化参数。
- Exception(Javax.lang.Throwable)在某个页面抛出异常时,将转发至JSP错误页面,提供此对象是为了在JSP中处理错误。只有在错误页面中才可使用<%@page isErrorPage=“true”%>
servlet跳转页面两种方式
- 转发 req.getRequestDispatcher(“xxx”).forwarzd(req, resp);
- 重定向 resp.sendRedirect(“xxx”);
区别
- 转发
请求只有一次
url地址不变 - 重定向
请求有两次
url地址发生变更
test1:
package com.test.class3;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
public class Test1Servlet extends GenericServlet {
@Override
public void init() throws ServletException {
// 第一次被调用的时候会执行一次init方法
// 或者在load-on-startup。在启动tomcat 的时候就会执行,就不需要等到调用的时候才执行
System.out.println("我是Test1Servlet的init方法,我被创建出来了");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("我是Test1Servlet的service方法,为你提供服务");
}
@Override
public void destroy() {
System.out.println("我是Test1Servlet的destroy方法,我被销毁了");
}
}
jsp1:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 这个文件就是html 页面的内容,可以在jsp中写(html/css/js/jq -->
<!-- jsp的本质:就是servlet,jsp页面经过翻译阶段,吧jsp文件翻译成java文件
这个java文件其实就是servlet -->
声明语法
<%!//全局变量:在java类型中声明属性
int i;
String str;%>
<%
System.out.println("执行Test2.jsp");
%>
输出到页面out.print()
<%="123456787我是输出的内容; "%>
<!-- include动态引用、静态引用 2个都叫做include,可是标签不一样 -->
<%@ include file="Test3.jsp"%><!-- 静态引用 -->
<jsp:include page="Test3.jsp"></jsp:include><!-- 动态引用 -->
</body>
</html>
jsp2:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
我是被引用的内容22333
</body>
</html>
jsp3:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
jsp九大内置对象 代码标签中,作用是什么,就是简化在jsp中编写java代码而已(现在一般不会在页面中写java代码)
<%
//request请求
request.getLocalAddr();
//response响应
response.setCharacterEncoding("UTF-8");
//session会话
session.getAttribute("");
//application全局
application.getAttribute("");
//out页面输出
out.print("");
//pageContext当前页面
pageContext.getAttribute("");
//page当前页面
page.toString();
//config配置
config.getInitParameter("");
//exception异常
%>
</body>
</html>
jsp4:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- servlet跳转页面的两种方式
转发
q.getRequestDispatcher("xxx").forwarzd(req,resp);
重定向
resp.senRedirect("xxx");
-->
<!-- 登陆功能,使用账号密码登陆 -->
<form action="http://localhost:8080/day44-2/Test4Servlet" mothed="get">
账号:<input type="text" name="username"><br>
密码:<input type="text" name="pwd"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
test4Servlet:
package com.test.class4;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Test4Servlet")
public class Test4Servlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// 登陆成功就跳转到登陆成功页面
// 失败就跳转到失败页面
// 我们现在没有链接数据库,就先写死一个账号密码
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
if ("admin".equals(username) && "123456".equals(pwd)) {
// 登陆成功,跳转到成功页面
// 跳转的页面路径从WebContent文件夹开始算class4/Test5.jsp
req.getRequestDispatcher("class4/Success.jsp").forward(req, res);
} else {
// 登陆失败,跳转到失败页面
((HttpServletResponse) res).sendRedirect("class4/fail.jsp");// 重定向可以重新跳转请求和路径。
}
}
}
success.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
成功
</body>
</html>
fail.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
失败
</body>
</html>