文章目录
Servlet
- tomcat
- Mysql
- web前端
- html
- css
- js
- juery
- es6
- npm
- nodejs
- javaWEB阶段
- servlet
- jsp (淘汰了)
1.Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。
1.1 Servlet接口
This interface defines methods to initialize a servlet, to service requests, and to remove a servlet from the server. These are known as life-cycle methods and are called in the following sequence: 该接口定义了方法来初始化servlet,处理请求,和删除服务器上的servlet。 这些生命周期的方法按以下顺序调用。
- The servlet is constructed, then initialized with the
init
method.构造servlet,然后init方法初始化。- Any calls from clients to the
service
method are handled.处理客户端对service方法的任何调用。- The servlet is taken out of service, then destroyed with the
destroy
method, then garbage collected and finalized. Servlet从服务中取出,然后destory方法清除,接着垃圾收集和终止。
HelloServlet.java
package com.shangguan.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* Description:
*
* @Author:一尘
* @Version:1.0
* @Date:2020-09-16-9:31
*/
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("----init--------");
System.out.println(config);
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("---------service-----------");
System.out.println(req.getLocalName());
System.out.println(req.getLocalPort());
res.getWriter().write("Hello Servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("----------destroy--------------");
}
}
web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.shangguan.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h2>Hello World!</h2>
<a href="hello">Hello World</a>
</body>
</html>
- init
- 初始化方法 服务器自动实例化servlet对象了,并在后台自己实例化很多的对象,传入servlet中供我们使用(使用到了IOC和DI的思想)
Servlet 执行以下主要任务:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
1.2 GenericServlet
GenericServlet是Servlet接口的实现类,是和http协议无关的,是对Servlet接口的增强类。
- getInitParamater()
- getInitParameterNames()
- getServletConfig()
- getServletContext()
HelloGenericServlet.java
package com.shangguan.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Enumeration;
/**
* Description:
*
* @Author:一尘
* @Version:1.0
* @Date:2020-09-16-10:23
*/
@WebServlet(urlPatterns = "/helloGenericServlet",
initParams = {
@WebInitParam(name="encoding",value = "utf-8"),
@WebInitParam(name = "address",value = "西安市")
})
public class HelloGenericServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//获取初始化参数
System.out.println(this.getInitParameter("encoding"));
//枚举
Enumeration<String> initParameterNames = this.getInitParameterNames();
while(initParameterNames.hasMoreElements()){
String name = initParameterNames.nextElement();
System.out.println(this.getInitParameter(name));
}
//获取初始化参数的接口
ServletConfig servletConfig = this.getServletConfig();
System.out.println(servletConfig.getInitParameter("encoding"));
//上下文对象
ServletContext servletContext = this.getServletContext();
// /servlet_demo01_war_exploded web应用的名称 部署在服务器上的web应用的的名称
System.out.println(servletContext.getContextPath());
}
}
web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.shangguan.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!--<servlet>
<servlet-name>helloGeneric</servlet-name>
<servlet-class>com.shangguan.servlet.HelloGenericServlet</servlet-class>
<!–当前的Servlet的初始化参数–>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>helloGeneric</servlet-name>
<url-pattern>/helloGenericServlet</url-pattern>
</servlet-mapping>-->
</web-app>
1.3 ServletConfig
是获取当前的Servlet配置信息的接口
A servlet configuration object used by a servlet container to pass information
to a servlet during initialization. 一个servlet配置对象,在初始化过程中由servlet容器传递信息给servlet。当前的Servlet初始化配置信息。只能被当前的Servlet所使用。
1.4 ServletContext
web application的上下文环境,一个web应用只有一个环境。
上下文中的数据,可以被所有的Servlet所共享。
- getAttribute()
- getAttributeNames()
- getRealPath()
- getServletPath()
- getServletName()
- getRequestDIspatcher()
- removeAttribute()
- setAttribute()
- getInitParamter()
- getInitParameterNames()
servletContext是我们的全局的域对象.
package com.shangguan.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Enumeration;
/**
* Description:
*
* @Author:一尘
* @Version:1.0
* @Date:2020-09-16-10:23
*/
@WebServlet(urlPatterns = "/helloGenericServlet",
initParams = {
@WebInitParam(name="encoding",value = "utf-8"),
@WebInitParam(name = "address",value = "西安市")
})
public class HelloGenericServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//获取初始化参数
System.out.println(this.getInitParameter("encoding"));
//枚举
Enumeration<String> initParameterNames = this.getInitParameterNames();
while(initParameterNames.hasMoreElements()){
String name = initParameterNames.nextElement();
System.out.println(this.getInitParameter(name));
}
//获取初始化参数的接口
ServletConfig servletConfig = this.getServletConfig();
System.out.println(servletConfig.getInitParameter("encoding"));
//上下文对象
ServletContext servletContext = this.getServletContext();
// /servlet_demo01_war_exploded web应用的名称 部署在服务器上的web应用的的名称
System.out.println(servletContext.getContextPath());
//获取全局的初始化参数
System.out.println(servletContext.getInitParameter("age"));
servletContext.setAttribute("king","詹姆斯");
System.out.println(servletContext.getAttribute("king"));
}
}
1.5 HttpServlet
是基于我们的网络协议的/ htpp /https
我们没有必要去重写service方法, service方法会分发我们的网络请求到我们的doxxx方法中进行处理。
我们请求的提交方式有get post
我们重写doGet doPost方法就可以了。
在我们的httpServlet中我们要去研究两个东西:
- HttpServletRequest
- HttpServletResponse
1.5.1 HttpServletRequest
是servletRequest接口的实现类。
servlet容器实例化我们的httpServletRequest对象,将他作为参数传递给我们的doxxx方法去使用。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req,resp);
}
-
getConetxtPath() 获取上下文路径
-
getCookies()
-
getHeader()
-
getHeaerNames()
-
getHeaders()
-
getMethod() 获取请求方式
-
getQueryString() ?name=admin&age=10
-
getRemoterUser()
-
getRequestURL()
-
getRequestURI()
-
getServletPath()
-
getSession()
-
getAttribute()
-
getAttributeNames()
-
getCharacterEncoding()
-
getContentLength()
-
getContentType()
-
getInputStream()
-
getLocalAddr()
-
getLocalName()
-
getLocalPort()
-
getParameter()
-
getParameterNames()
-
getServerName()
-
getScheme() 获取协议
-
getReader()
-
getRealPath()
-
getRequestDispatcher() 请求分发器
-
setAttribute()
-
removeAttribute()
HelloHttpServletRequest.java
package com.shangguan.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
/**
* Description:
*
* @Author:一尘
* @Version:1.0
* @Date:2020-09-16-14:13
*/
@WebServlet("/helloHttpServlet")
public class HelloHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("-----------获取服务器信息--------------");
System.out.println(req.getScheme()); //协议
System.out.println(req.getLocalName());//主机
System.out.println(req.getLocalPort());//端口
System.out.println(req.getServerName());//服务名 主机
System.out.println("----------------获取http协议 请求头--------------");
System.out.println(req.getHeader("Cookie"));
Enumeration<String> headerNames = req.getHeaderNames();
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
System.out.println(req.getHeader(name));
}
System.out.println("---------------web应用的信息-------------");
System.out.println(req.getRequestURI());//资源路径
System.out.println(req.getRequestURL());//绝对路径
System.out.println(req.getMethod());//请求方式
System.out.println(req.getContextPath());//上下文路径 web应用的根路径
System.out.println("--------------请求参数------------");
req.setCharacterEncoding("utf-8");
String name = req.getParameter("name");
String age = req.getParameter("age");
System.out.println(req.getCharacterEncoding());
System.out.println(name + "-----"+ age);
System.out.println(req.getContentType()); //null
System.out.println("----------页面跳转-------------");
req.setAttribute("address","西安市高新区");
/**
* 客户端发送请求,服务器接收请求 在doxxx中进行处理,处理完成以后再获取资源分发器判断
* 要跳转的目标页面是否存在,页面存在,有服务器进行页面跳转,从始至终只发送了一次请求。
* 页面跳转只有一次请求,
* 页面跳转url地址栏不会发生变化
*
*
* */
req.getRequestDispatcher("/info.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req,resp);
}
}
页面跳转:
* 客户端发送请求,服务器接收请求 在doxxx中进行处理,处理完成以后再获取资源分发器判断
* 要跳转的目标页面是否存在,页面存在,有服务器进行页面跳转,从始至终只发送了一次请求。
* 页面跳转只有一次请求,
* 页面跳转url地址栏不会发生变化
req.getRequestDispatcher("/info.jsp").forward(req,resp);