Servlet
Servlet的三大职责
1.接受参数 –> req.getParameter (非必须)
2.处理业务 –> 拿到数据后去做一些事情(非必须)
3.跳转(必须)–> 操作完的一个结果 两句代码
跳转:请求转发和重定向
请求转发
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起作用,不可以跨域[跨网站]访问
重定向
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
@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
用请求转发和重定向完善登录
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</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);
}
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</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("<!DOCTYPE html>");
writer.print("<html>");
writer.print("<head>");
writer.print("<meta charset="UTF-8">");
writer.print("<title>Insert title here</title>");
writer.print("</head>");
writer.print("<body>");
writer.print(attribute);
writer.print(" <form action="/loginTest" method="post">");
writer.print(" 账号:<input type="text" name="username"><br>");
writer.print(" 密码:<input type="password" name="password"><br>");
writer.print(" <input type="submit" value="post">");
writer.print(" </form>");
writer.print("</body>");
writer.print("</html>");
}
}
JSP
第一个JSP
概述
servlet:是用来写java代码的,也可以用来做页面展示(把html代码一行一行打印出去),但是不擅长做页面展示。
html:用来做页面展示,静态网页,没办法拿到Java代码,不能展示数据。
jsp:看起来像html,但是它里面可以写java代码(动态网页)。
注释
<%@ 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 here</title>
</head>
<body>
<!-- 不安全的注释,能在控制台看到 -->
<%-- 安全的注释,不能再控制台看到 --%>
<h1>我是第一个JSP</h1>
</body>
</html>
设置创建JSP文件默认字符编码集
JSP文件内右键 – Preferences – utf-8
JSP的java代码书写
<%@ 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 here</title>
</head>
<body>
<!-- jsp写java代码的第一种方式,打印到后端控制台 -->
<%
for(int i = 0;i<5;i++){
System.out.println("i: "+i);
}
int b =520;
%>
<!-- jsp写java代码的第二种方式,显示在页面上 -->
<%=b %>
<!-- jsp写java代码的第三种方式,涉及JSP的底层原理 -->
<%!
String ss ="abc";
// System.out.println("abc: "+ss);
%>
</body>
</html>
JSP的原理
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"%>
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 here</title>
</head>
<body>
<div>螺旋丸</div>
</body>
</html>
<%@ 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 here</title>
</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>
九大内置对象
改造动态web工程进行示例
改造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);
}
}
}
<%@ 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 here</title>
</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没有关闭就不会消失,在不同的浏览器都能拿到
案例测试
<%@ 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 here</title>
</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>
<%@ 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 here</title>
</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 here</title>
</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 here</title>
</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 here</title>
</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 here</title>
</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);
}
}
}
<%@ 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 here</title>
</head>
<body>
恭喜你登录成功<%=session.getAttribute("name")%>
</body>
</html>
原文地址:https://blog.csdn.net/ffhgjgj6576567/article/details/134558839
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_12601.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!