Servlet

Servlet的三大职责

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 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") &amp;&amp; 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 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代码动态网页)。

注释

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 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>
        <!-- jspjava代码的第一种方式打印到后端控制台 -->
            <%
                for(int i = 0;i<5;i++){
                    System.out.println("i: "+i);
                }

                int b =520;
            %>

        <!-- jspjava代码的第二种方式显示页面上 -->
            <%=b %>

        <!-- jspjava代码的第三种方式,涉及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"%>

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 here</title>
</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 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") &amp;&amp; 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 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没有关闭就不会消失,在不同的浏览器都能拿到

在这里插入图片描述

案例测试

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 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>

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 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") &amp;&amp; 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 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进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注