笔记根据“尚硅谷”JavaWEB教学视频以及老师课后学习资料整理,若有错误以老师为准。笔记是博主一字一字亲手码出来的,由于自己还是学习阶段,本质还是在模仿的基础上加入自己的拙见。所以笔记会有很多地方和老师的资料有雷同,如有侵权,请大胆联系博主删除!!!因为自己的原因看到剩100集左右没有继续看下去,笔记存放时间有点久,有的图失效了,如果之后又时间博主尽量补上这个坑。
部署了tomcat之后实现Servlet接口报错,提示找不到接口,导入import javax.servlet.*;也没有用。
解决方法:
file----->Project Structure----->Libraries
------>点击➕选择java-------->选择tomcat安装目录------->选择lib文件夹
------->选择servlet-api.jar和jsp-api.jsp---->点击ok------->点击apply
------->选择Artifacts
----->选择WEB-INF点击创建文件夹的按钮创建文件夹lib
------->点击lib点击➕-------->选择Library Files
------>选择刚刚在Libraries中添加的jar文件----->点击apply
注意:将tomcat部署在web项目之后
file----->Project Structure----->Project
Project SDK和Project language level要选择对应的版本
SDK选1.8Project language level就要选8,否则tomcat就会启动失败。
实现Servlet接口
package com.company.test;
import javax.servlet.*;
import java.io.IOException;
/**
* ClassName: servletTest
* Description:
* date: 2021/12/1 9:12
*
* @author zhangyingying
* @since JDK 1.8
*/
public class servletTest implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/*
* @Description: service方法是专门用来处理请求和响应的
* @author: zhangyingying
* @date: 2021/12/1 10:42
* @Param: servletRequest
* @Param: servletResponse
* @return:void
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet成功运行!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void 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">
<servlet>
<servlet-name>servletTestservlet-name>
<servlet-class>com.company.test.servletTestservlet-class>
servlet>
<servlet-mapping>
<servlet-name>servletTestservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
web-app>
常见错误:
失效图片
执行Servlet构造器方法
执行init初始化方法
第一、二步,是在第一次访问的时候创建Servlet程序会调用,说明这个程序是单例的。
执行service方法
第三步:每次访问都会调用
执行destory销毁方法
第四步:在web工程停止的时候调用
GET和POST请求的分发处理
package com.company.test;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* ClassName: servletTest
* Description:
* date: 2021/12/1 9:12
*
* @author zhangyingying
* @since JDK 1.8
*/
public class servletTest implements Servlet {
public servletTest() {
System.out.println("1 构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 初始化方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/*
* @Description: service方法是专门用来处理请求和响应的
* @author: zhangyingying
* @date: 2021/12/1 10:42
* @Param: servletRequest
* @Param: servletResponse
* @return:void
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//类型转换(因为它有getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
System.out.println("Servlet成功运行!");
System.out.println("3 service请求");
String method = httpServletRequest.getMethod();
if("GET".equals(method)){
doGet();
}else if("POST".equals(method)){
doPost();
}
}
private void doPost() {
System.out.println("get请求");
}
private void doGet() {
System.out.println("post请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4 destroy销毁");
}
}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<form action="/hello" method="post">
<input type="submit"/>
form>
body>
html>
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法
3、到 web.xml 中的配置 Servlet 程序的访问地址
**编写一个类去继承 HttpServlet 类 **
package com.company.test;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* ClassName: HttpServletTest
* Description:
* date: 2021/12/1 14:08
*
* @author zhangyingying
* @since JDK 1.8
*/
public class HttpServletTest extends HttpServlet {
/*
* @Description:doGet:在get请求的时候调用
* @author: zhangyingying
* @date: 2021/12/1 14:11
* @param:
* @Param: req
* @Param: resp
* @return:void
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
System.out.println("HttpServletTest的doGet方法");
}
/*
* @Description: doPost:在post请求的时候调用
* @author: zhangyingying
* @date: 2021/12/1 14:13
* @param:
* @Param: req
* @Param: resp
* @return:void
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
System.out.println("HttpServletTest的doPost方法");
}
}
页面
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<form action="/hello2" method="post">
<input type="submit"/>
form>
body>
html>
配置HttpServlet程序访问地址
<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">
<servlet>
<servlet-name>HttpServletTestservlet-name>
<servlet-class>com.company.test.HttpServletTestservlet-class>
servlet>
<servlet-mapping>
<servlet-name>HttpServletTestservlet-name>
<url-pattern>/hello2url-pattern>
servlet-mapping>
web-app>
右键要创建Servlet包类的包,选择new选择Servlet,不要勾选Create Java EE 6+ annotated class,填写类名之后点击确定
如果右键没有Servlet选项:file----->Project Structure----->Facets----->SourceRoots下的路径前打勾----->apply----->ok
javax.servlet:Interface Servlet:Servlet接口,只是负责定义Servlet程序的访问规范。
javax.servlet:Class GenericServlet(实现上面的接口): GenericServlet类实现了Servlet接口,做了很多空实现。并有一个ServletConfig类的引用,并对ServletConfig的使用做了一些方法。
javax.servlet.http:Class HttpServlet(继承上面的类):HttpServlet抽象类实现了service()方法,并实现了请求的分发处理
String method = req.getMethod();
| |
/ \
GET POST
| |
doGet() doPost() 负责抛异常,说不支持GET/POST请求
自定义的Servlet程序(继承上面的类):我们只需要根据自己的业务需要重写doGet()和doPost()方法即可。
ServletConfig类从类名上看,就知道是Servlet程序的配置信息类。
Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用
Servlet程序默认是第一次访问的时候创建的,ServletConfig是每个Servlet程序创建时就创建一个ServletConfig对象。
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">
<servlet>
<servlet-name>servletTestservlet-name>
<servlet-class>com.company.test.servletTestservlet-class>
<init-param>
<param-name>usernameparam-name>
<param-value>rootparam-value>
init-param>
<init-param>
<param-name>urlparam-name>
<param-value>jdbc:mysql://localhost:3306/testparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>servletTestservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
web-app>
package com.company.test;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* ClassName: servletTest
* Description:
* date: 2021/12/1 9:12
*
* @author zhangyingying
* @since JDK 1.8
*/
public class servletTest implements Servlet {
public servletTest() {
System.out.println("1 构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 初始化方法");
//1. 可以获取Servlet程序的别名servlet-name的值
System.out.println("servletTest程序的别名是:" + servletConfig.getServletName());
//2. 获取初始化参数init-param
System.out.println("初始化参数username的值是:" + servletConfig.getInitParameter("username"));
//3. 获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/*
* @Description: service方法是专门用来处理请求和响应的
* @author: zhangyingying
* @date: 2021/12/1 10:42
* @Param: servletRequest
* @Param: servletResponse
* @return:void
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//类型转换(因为它有getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
System.out.println("Servlet成功运行!");
System.out.println("3 service请求");
String method = httpServletRequest.getMethod();
if("GET".equals(method)){
doGet();
}else if("POST".equals(method)){
doPost();
}
}
private void doPost() {
System.out.println("get请求");
}
private void doGet() {
System.out.println("post请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4 destroy销毁");
}
}
重写init方法里面一定要调用父类的init(ServletConfig)操作:super.init(config);
**域对象:**是可以像map一样存取数据的对象,这里的域指的是存取数据的操作范围。整个web工程
存数据 取数据 删除数据
Map put() get() remove()
域对象 setAttribute() getAttribute() removeAttribute()
获取web.xml中配置的上下文参数context-param
获取当前的工程路径,格式:/工程路径
获取工程部署后在服务器硬盘上的绝对路径
Servlet在wbe工程部署启动的时候创建。在web程停止的时候销毁。
package com.company.test; /**
* ClassName: ${NAME}
* Description:
* date: 2021/12/1 17:16
*
* @author zhangyingying
* @version
* @since JDK 1.8
*/
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class ContextServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取web.xml中配置的上下文参数context-param
ServletContext servletContext = getServletConfig().getServletContext();
String username = servletContext.getInitParameter