对于没有接触过Servlet程序的小伙伴在首次学习中,可能会有一个大大的疑问,什么是Servlet?
手动创建一个Servlet程序实现Servlet接口,实现service方法
public class HelloServlet implements Servlet {
/***
* service方法用来处理请求和响应的
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("HelloServlet被访问了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
web.xml中配置servlet
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--servelt标签给Tomcat服务器配置Servlet程序-->
<servlet>
<!--servlet-name标签:给Servlet程序起一个别名(一般是类名)-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class是Servlet程序的全类名-->
<servlet-class>com.westos.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet-mapping标签:可以给servelt程序配置访问路径-->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,当前配置的地址给哪个Servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern标签配置访问地址
/ 斜杠表示服务器解析的时候,表示地址为:http://ip:port/工程路径
/hello 表示地址为:http://ip:port/工程路径/helloo
-->
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
</web-app>
从浏览器地址栏中输入的地址到Servlet程序访问过程可以用下图具体进行阐述。
Servlet内方法的执行顺序:
注意:第1、2步,是在第一次访问的才会调用。
第3步,每次访问都会被调用。
第4步,在web工程停止的时候调用。
public class HelloServlet2 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service方法被执行了==HelloServlet被访问了");
//类型转换(因为转换后的类型具有getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
//获取请求的方式
String method = httpServletRequest.getMethod();
if (("GET").equals(method)) {
doGet();
}else if(("POST").equals(method)){
doPost();
}
}
/**
* 做get请求的操作
*/
public void doGet(){
System.out.println("get请求");
}
/**
*做post请求的操作
*/
public void doPost(){
System.out.println("post请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
上面实现Servlet接口不是特别方便,在一般实际项目中,都是使用继承HttpServlet类的方式去实现Servlet程序。
Servlet类的代码:
public class HelloServlet3 extends HttpServlet {
/***
* doGet()在get请求的时候进行调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet3的doGet方法");
}
/***
*doPost()在post请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet3的doPost方法");
}
}
web.xml中的配置
<servlet>
<servlet-name>HelloServlet3</servlet-name>
<servlet-class>com.westos.servlet.HelloServlet3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet3</servlet-name>
<url-pattern>/helloServlet3</url-pattern>
</servlet-mapping>
Servlet类从类名上来看,是Servlet程序的配置信息类。
Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们只负责使用。
Servlet程序默认是第一次访问的时候创建,ServletConfig是每个ServletConfig是每个Servlet程序创建时,就会创建一个对应的ServletConfig对象。
ServletConfig类的三大作用:
Servlet中的代码:
public class HelloServlet4 extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init 初始化方法");
//1.可以获取Servlet程序的别名servlet-name的值
System.out.println("HelloServlet程序的别名是:"+config.getServletName());
//2.获取初始化参数init-param
System.out.println("初始话参数username的值为:"+config.getInitParameter("username"));
System.out.println("初始化参数url的值是:"+config.getInitParameter("url"));
//3.获取ServletContext对象
System.out.println(config.getServletContext());
}
}
web.xml中的配置:
<!--servlet标签给Tomcat配置Servlet程序-->
<servlet>
<!--servlet-name标签Servlet程序起一个别名(一般是类名)-->
<servlet-name>HelloServlet4</servlet-name>
<servlet-class>com.westos.servlet.HelloServlet4</servlet-class>
<!--init-param是初始化参数-->
<init-param>
<!--参数名-->
<param-name>username</param-name>
<!--参数值-->
<param-value>root</param-value>
</init-param>
<init-param>
<!--参数名-->
<param-name>url</param-name>
<!--参数值-->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet4</servlet-name>
<url-pattern>/helloServlet4</url-pattern>
</servlet-mapping>
域对象,是可以像Map一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围,为整个web工程。
存数据 | 取数据 | 删除数据 | |
---|---|---|---|
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
ServletContext类四个作用:
ServletContext代码配置上下文参数,当前工程路径,获取工程部署在服务器硬盘上的绝对路径:
public class HelloServlet5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取web.xml中配置的上下文参数context-param
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
System.out.println("context-param参数username的值是:"+username);
System.out.println("context-param参数password的值是:"+context.getInitParameter("password"));
//2.获取当前的工程路径,格式:/工程路径
System.out.println("当前工程路径:"+context.getContextPath());
//3.获取工程部署在服务器硬盘上的绝对路径
/**
* / 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射在IDEA代码的web目录
*/
System.out.println("工程部署的路径在:"+context.getRealPath("/"));
}
}
web.xml配置文件中的配置:
<!--context-param是上下文参数(它是属于整个web工程)-->
<context-param>
<param-name>username</param-name>
<param-value>context</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
ServletContext像Map一样存取数据:
public class ContextServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext对象
ServletContext context = getServletContext();
System.out.println(context);
System.out.println("保存之前:Context获取key1的值为:"+context.getAttribute("key1"));
context.setAttribute("key1","value1");
System.out.println("Context1中获取域数据key1的值是"+context.getAttribute("key1"));
}
}
协议是指双方或者多方相互约定好的,大家都需要遵守的规则称为协议。
所谓HTTP协议,就是指客户端或者服务器之间通信时,发送的数据需要遵守的规则叫做HTTP协议。HTTP协议中的数据又叫做报文。
客户端给服务器发送数据称为请求。服务器给客户端回传数据称为响应。
请求又分为GET请求和POST请求。
GET请求的具体组成部分 |
---|
1.请求行:(1)请求的方式 GET(2)请求的资源路径[+?+请求参数] (3)请求的协议的版本号:HTTP/1.1 |
2.请求头: key:value组成 不同的键值对,表示不同的含义 |
POST请求的组成部分 |
---|
1.请求行:(1)请求的方式 POST (2)请求的资源路径[+?+请求参数] (3)请求的协议版本号:HTTP/1.1 |
2.请求头:key:value 不同的请求头,有不同的含义 |
空格 |
3.请求体======>>>>>就是发送到服务器的数据 |
GET请求有哪些 |
---|
1.form标签 method=get |
2.a标签 |
3.link标签引入css |
4.Script标签引入js文件 |
5.img标签引入html页面 |
6.iframe引入html页面 |
7.在浏览器地址栏中输入地址后敲回车 |
POST请求有哪些 |
---|
1.form标签 method=post |
响应的HTTP协议格式 |
---|
1.响应行 (1)响应的协议和版本号(2)响应状态码 (3)响应状态描述符 |
2.响应头 key:value 不同的响应头,有不同的含义 |
空行 |
3.响应体=====》就是回传给客户端的数据 |
常用响应码说明 |
---|
200:表示请求成功 |
302:表示请求重定向 |
404:表示请求服务器已经收到了,但是要的数据不存在(请求地址错误) |
500:表示服务器已经收到请求,但是服务器内部错误(代码错误) |
谷歌浏览器查看HTTP协议:
学习图片资源内容来源:
B站:尚硅谷2020最新版JavaWeb全套教程,java web零基础入门完整版
https://www.bilibili.com/video/BV1Y7411K7zz?
上为个人学习笔记