1.接受参数 --> req.getParameter (非必须)
2.处理业务 --> 拿到数据后去做一些事情(非必须)
3.跳转(必须)–> 操作完的一个结果 两句代码
案例演示:动态web项目
AServlet
@WebServlet("/go/a")
public class AServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("AServlet");
String name = req.getParameter("name");
System.out.println("A-name: "+name);
req.setAttribute("password", "123456");
// 请求转发
req.getRequestDispatcher("/go/b").forward(req, resp);
}
}
BServlet
@WebServlet("/go/b")
public class BServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("BServlet");
String name = req.getParameter("name");
System.out.println("B-name: "+name);
String password = (String) req.getAttribute("password");
System.out.println("B-password: "+password);
}
}
浏览器访问:http://localhost/go/a?name=zhangsan
控制台:
AServlet
A-name: zhangsan
BServlet
B-name: zhangsan
B-password: 123456
req.getRequestDispatcher(“路径”).forward(request, response); ,请求里的东西,forward可以理解为携带
带值跳转,可以访问WEB-INF中资源,地址栏不改变
发送一次请求,最后一个response起作用,不可以跨域[跨网站]访问
案例演示:动态web项目
CServlet
@WebServlet("/go/c")
public class CServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("CServlet");
String name = req.getParameter("name");
System.out.println("C-name: "+name);
resp.sendRedirect("/go/d");
}
}
DServlet
@WebServlet("/go/d")
public class DServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("DServlet");
String name = req.getParameter("name");
System.out.println("D-name: "+name);
}
}
浏览器访问:http://localhost/go/c?name=zhangsan
控制台:
CServlet
C-name: zhangsan
DServlet
D-name: null
resp.sendRedirect(“路径”) ,响应里的东西,可以有避免重复扣款和访问外部网站之类的作用
无法带值,不能访问WEB-INF下内容,地址栏改变
两次请求,起作用的依然是最后一个,可以跨域访问
请求转发的特点:可以携带参数,只用一次请求,可以访问WEB-INF
重定向的特点:可以避免重复扣款场景风险,可以访问外部网站,不能访问WEB-INF
请求转发过程:浏览器 - 内部代码 - WEB-INF
重定向过程:浏览器 - 内部代码 - 浏览器 - URL
动态web项目示例:
EServlet
@WebServlet("/go/e")
public class EServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("EServlet");
System.out.println("E----扣款1000");
// req.getRequestDispatcher("/go/f").forward(req, resp);
// resp.sendRedirect("/go/f");
// resp.sendRedirect("https://www.fu365.com/");
// req.getRequestDispatcher("/WEB-INF/haha.html").forward(req, resp);
// resp.sendRedirect("/WEB-INF/haha.html");
}
}
FServlet
@WebServlet("/go/f")
public class FServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("FServlet");
}
}
WEB-INF下新建haha.html
浏览器访问:http://localhost/go/e
webapp下WEB-INF外新建login.html
DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title heretitle>
head>
<body>
<form action="/loginTest" method="post">
账号:<input type="text" name="name"><br>
密码:<input type="password" name="password">
<input type="submit" value="post">
form>
body>
html>
loginTest
@WebServlet("/loginTest")
public class LoginServletTest extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
String name = req.getParameter("name");
String password = req.getParameter("password");
if ( name.equals("zhangsan") && password.equals("123456") ) {
resp.sendRedirect("main.html"); //这里在WEB-INF外重定向可以访问
} else {
req.setAttribute("msg", "登录失败");
// 需要访问另外一个servlet,把参数传进页面打印出来
req.getRequestDispatcher("/AAAServlet").forward(req, resp);
}
}
}
main.html
DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title heretitle>
head>
<body>
<h1>登录成功h1>
body>
html>
AAAServlet
@WebServlet("/AAAServlet")
public class AAAServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object attribute = req.getAttribute("msg");
System.out.println(attribute);
PrintWriter writer = resp.getWriter();
writer.print("");
writer.print("");
writer.print("");
writer.print("");
writer.print("Insert title here ");
writer.print("");
writer.print("");
writer.print(attribute);
writer.print(" );
writer.print(" 账号:
");
writer.print(" 密码:
");
writer.print(" ");
writer.print(" ");
writer.print("");
writer.print("");
}
}
servlet:是用来写java代码的,也可以用来做页面展示(把html代码一行一行打印出去),但是不擅长做页面展示。
html:用来做页面展示,静态网页,没办法拿到Java代码,不能展示数据。
jsp:看起来像html,但是它里面可以写java代码(动态网页)。
webapp下新建_01hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<%-- 安全的注释,不能再控制台看到 --%>
<h1>我是第一个JSPh1>
body>
html>
JSP文件内右键 - Preferences - utf-8
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<%
for(int i = 0;i<5;i++){
System.out.println("i: "+i);
}
int b =520;
%>
<%=b %>
<%!
String ss ="abc";
// System.out.println("abc: "+ss);
%>
body>
html>
jsp需要tomcat运行才能正常展示内容
访问JSP - tomcat的web.xml - 两个servlet类(把JSP转化为servlet/java文件,把html代码打印出去)
tips:tomcat的web.xml是全局的,项目中的web.xml是局部的
1.page :当前页面的一些配置,jsp生成java文件时会引用这些配置
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
2.taglib:不讲 (下一节来说 )
3.include:引用一个文件,常用于导航栏
_03include.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="head.jsp" %>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<div>螺旋丸div>
body>
html>
_04include.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<div>千年杀div>
<%@include file="head.jsp" %>
body>
html>
head.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<div style="background-color:red;text-align:center;font-size:50px">火影忍者div>
改造LoginServletTest,登录失败后跳转到login.jsp
@WebServlet("/loginTest")
public class LoginServletTest extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
String name = req.getParameter("name");
String password = req.getParameter("password");
if ( name.equals("zhangsan") && password.equals("123456") ) {
resp.sendRedirect("main.html"); //这里在WEB-INF外重定向可以访问
} else {
req.setAttribute("msg", "登录失败");
// 需要访问另外一个servlet,把参数传进页面打印出来
// req.getRequestDispatcher("/AAAServlet").forward(req, resp);
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
}
webapp下新增login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<%=request.getAttribute("msg") %>
<form action="/loginTest" method="post">
账号:<input type="text" name="name"><br>
密码:<input type="password" name="password">
<input type="submit" value="post">
form>
body>
html>
来自tomcat根据jsp生成的java文件,在那里面定义了
HttpServletRequest request 请求对象
HttpServletResponse response 响应对象
ServletConfig config 配置对象
ServletContext application
Throwable exception 异常( 你当前页面是错误页时才有 isErrorPage="true" )
JspWriter out 输出流对象
Object page 相当于this 是当前页的意思
PageContext pageContext 没好大用处
HttpSession session 会话对象(重要)
HttpServletRequest request 一次请求
HttpSession session 一次会话 同一个浏览器访问tomcat就是一次会话
PageContext pageContext 当前页面 作用不大
ServletContext application 整个会话tomcat没有关闭就不会消失,在不同的浏览器都能拿到
webapp下新增_05page.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<%
pageContext.setAttribute("iampageContext","我是当前页对象");
request.setAttribute("iamrequest", "我是请求对象");
session.setAttribute("iamsession", "我是会话对象");
application.setAttribute("iamapplication", "我是应用对象");
%>
<%=pageContext.getAttribute("iampageContext")
%>
<%=request.getAttribute("iamrequest")
%>
<%=session.getAttribute("iamsession")
%>
<%=application.getAttribute("iamapplication")
%>
body>
html>
webapp下新增_06page.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<%=pageContext.getAttribute("iampageContext")
%>
<%=request.getAttribute("iamrequest")
%>
<%=session.getAttribute("iamsession")
%>
<%=application.getAttribute("iamapplication")
%>
body>
html>
启动tomcat,浏览器访问http://localhost/_05page.jsp,我是当前页对象 我是请求对象 我是会话对象 我是应用对象
浏览器访问http://localhost/_06page.jsp,null null 我是会话对象 我是应用对象
换一个浏览器访问http://localhost/_06page.jsp,null null null 我是应用对象
重启原浏览器访问http://localhost/_06page.jsp,null null null 我是应用对象
重启tomcat访问http://localhost/_06page.jsp,null null null null
修改_05page.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<%
pageContext.setAttribute("iampageContext","我是当前页对象");
request.setAttribute("iamrequest", "我是请求对象");
session.setAttribute("iamsession", "我是会话对象");
application.setAttribute("iamapplication", "我是应用对象");
%>
<%
request.getRequestDispatcher("_06page.jsp").forward(request, response);
%>
body>
html>
启动tomcat,浏览器访问http://localhost/_05page.jsp,null 我是请求对象 我是会话对象 我是应用对象
修改_05page.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<%
pageContext.setAttribute("iampageContext","我是当前页对象");
request.setAttribute("iamrequest", "我是请求对象");
session.setAttribute("iamsession", "我是会话对象");
application.setAttribute("iamapplication", "我是应用对象");
%>
<%
//request.getRequestDispatcher("_06page.jsp").forward(request, response);
response.sendRedirect("_06page.jsp");
%>
body>
html>
启动tomcat,浏览器访问http://localhost/_05page.jsp,null null 我是会话对象 我是应用对象
修改_06page.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<%=pageContext.getAttribute("iampageContext")
%>
<%=request.getAttribute("iamrequest")
%>
<%=session.getAttribute("iamsession")
%>
<%=application.getAttribute("iamapplication")
%>
<%
request.getRequestDispatcher("_05page.jsp").forward(request, response);
%>
body>
html>
启动tomcat,浏览器访问http://localhost/_05page.jsp,报错:该网页无法正常运作,localhost将您重定向的次数过多。
改造login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true" %>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<%
if(request.getAttribute("msg")!=null){ %>
<%=request.getAttribute("msg") %>
<%} %>
<form action="/loginTest" method="post">
账号:<input type="text" name="name"><br>
密码:<input type="password" name="password">
<input type="submit" value="post">
form>
body>
html>
LoginServletTest设置数据到session作用域
@WebServlet("/loginTest")
public class LoginServletTest extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = req.getServletContext();
HttpSession session = req.getSession();
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
String name = req.getParameter("name");
String password = req.getParameter("password");
if ( name.equals("zhangsan") && password.equals("123456") ) {
session.setAttribute("name", "zhangsan");
resp.sendRedirect("main.jsp"); //这里在WEB-INF外重定向可以访问
} else {
req.setAttribute("msg", "登录失败");
// 需要访问另外一个servlet,把参数传进页面打印出来
// req.getRequestDispatcher("/AAAServlet").forward(req, resp);
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
}
新建main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
恭喜你登录成功<%=session.getAttribute("name")%>
body>
html>