JavaWeb -- Servlet

一、Servlet是什么

Server + Applet,是一种服务器端的Java应用程序。
只有当一个服务器端的程序使用了Servlet API的时候,这个服务端的程序才能称之为Servlet。

二、为什么要用Servlet

由于JSP页面过于杂乱,分离显示和业务逻辑显然更合适 → JSP负责显示,Servlet负责控制。
在这里插入图片描述

三、Servlet做了什么?

  • 本身不做任何业务处理
  • 只是接收请求并决定调用哪个JavaBean去处理请求
  • 确定用哪个页面来显示处理返回的数据

在这里插入图片描述

四、Servlet API

5.1 主要Servlet API介绍

  • javax.servlet.Servlet 接口:
    所有 Java Servlet 的基础接口类,规定了必须由 Servlet 具体类实现的方法集。
  • javax.servlet.GenericServlet 类
    是 Servlet 的通用版本,是一种与协议无关的 Servlet 。
  • javax.servlet.http.HttpServlet类
    在 GenericServlet 基础上扩展的基于 Http 协议的 Servlet 。

5.2 如何创建Servlet

  • 实现Servlet接口
  • 继承GenericServlet类
  • 继承HttpServlet类

五、Servlet中主要方法

  • init():Servlet的初始化方法,仅仅会执行一次
  • service():处理请求和生成响应
  • destroy():在服务器停止并且程序中的Servlet对象不再使用的时候调用,只执行一次
  • ServletRequest
    封装客户的请求信息
    作用相当于JSP内置对象request
  • ServletResponse
    创建响应信息,将处理结果返回给客户端
    作用相当于JSP内置对象response
  • ServletConfig:包含了servlet的初始化参数信息

六、Servlet生命周期

  • 加载和实例化
  • 初始化
  • 处理请求
  • 销毁
    在这里插入图片描述
    在这里插入图片描述

七、Servlet部署与运行

7.1 新手上路的部署

  1. 修改web.xml(部署描述文件)
    添加<servlet>:把Servlet内部名映射到一个Servlet类名。
    添加<servlet-mapping>:把用户访问的URL映射到Servlet的内。
  2. 通过URL访问Servlet

注意:<servlet-mapping>与<servlet>中的<servlet-name>必须一致。

在这里插入图片描述

7.2 快捷部署

一键完成三个操作:

  • 创建普通类
  • 继承 Servlet 并重写方法
  • 在 web.xml 中绑定
    在这里插入图片描述

八、简单的使用Servlet登陆示例

在这里插入图片描述
index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<%
String userName="";
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length>0){
	for(Cookie c : cookies){
		if("userName".equals(c.getName())){
			userName = c.getValue();
		}
	}
}
%>
</head>
<body>
	<form action="/day_0906_web5/loginServlet" method="post">
	姓名:<input type="text" name="userName" value="<%=userName %>" /><br />
	密码:<input type="password" name="userPassword" /><br />
	<input type="submit" value="subMe!" />
	</form>
</body>
</html>

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>欢迎</title>
</head>
<body>
	<h1>欢迎您!<%=session.getAttribute("userName") %></h1>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>day_0906_web5</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- servlet是写好了,但是你要告诉同名tomcat这里有个servlet要进行处理 -->
  <servlet>
  	<servlet-name>loginServlet</servlet-name>	<!-- 起个名字 -->
  	<servlet-class>servlet.LoginServlet</servlet-class>	<!-- 指定你要声明的servlet -->
  </servlet>
  
  <!-- 定义跳转,绑定servlet -->
  <servlet-mapping>
  	<servlet-name>loginServlet</servlet-name>	<!-- 找到你指定的servlet -->
  	<url-pattern>/loginServlet</url-pattern>	<!-- 是你的请求地址 -->
  </servlet-mapping>
</web-app>

LoginServlet.java

package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 在jsp页面上存在多种代码:
 * html:必须有的,少不掉
 * css:link标签链接出去
 * javascript:src属性也链接出去(js)
 * java:1、用来显示的,读取cookie的:必须有的
 * 		 2、用来处理业务逻辑和数据库交互等   login.jsp:用servlet分离出去
 */
/**
 * 如果要让一个普通的类变成servlet
 * 就要让继承javax.servlet.http.HttpServlet
 * @author Sowhite
 *
 */
public class LoginServlet extends HttpServlet {

	/**
	 * 这个方法就是专门用来处理get方式的请求,所有的get请求都会被传递到这个方法内
	 * 你所需要的request和response作为参数传递进来了,你只要用就可以了
	 */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 无论是get还是post都能到达这行代码
//		System.out.println("我是servlet,我被访问了!  ");
		req.setCharacterEncoding("utf-8");
		resp.setCharacterEncoding("utf-8");
		// 从表单获取数据
		String userName = req.getParameter("userName");
		String userPassword = req.getParameter("userPassword");
		if("jack".equals(userName) && "333".equals(userPassword)) {
			// cookie
			Cookie cookie = new Cookie("userName", userName);
			cookie.setMaxAge(60*5);
			resp.addCookie(cookie);
			
			// session 在servlet中是问req拿的
			HttpSession session = req.getSession();
			session.setAttribute("userName", userName);
			
			// 将数据传递给下一个页面
			resp.sendRedirect("/day_0906_web5/welcome.jsp");
		}else {
			resp.sendRedirect("/day_0906_web5");
		}
	}

	/**
	 * 专门处理post请求
	 */
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

效果:
index.jsp
在这里插入图片描述
welcome.jsp
在这里插入图片描述

推荐一篇更详细的博客:https://blog.csdn.net/qq_19782019/article/details/80292110

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值