JavaWeb学习笔记
本文章基于B站UP主:楠哥教你学Java 的课程《Java Web从入门到实战【完整版】》进行整理补充,本文章仅用于个人学习交流使用。
目录结构
1.Servlet篇
1.Tomcat
1.安装与配置
2.Tomcat的目录结构
bin:存放各个平台下启动和停⽌ Tomcat 服务的脚本⽂件。
conf:存放各种 Tomcat 服务器的配置⽂件。
lib:存放 Tomcat 服务器所需要的 jar。
logs:存放 Tomcar 服务运⾏的⽇志。
temp: Tomcat 运⾏时的临时⽂件。
webapps:存放允许客户端访问的资源(Java 程序)。
work:存放 Tomcat 将 JSP 转换之后的 Servlet ⽂件。
3.集成开发环境工具Intellij Idea的配置
2.Servlet简介
- 什么是 Servlet?
Servlet 是 Java Web 开发的基⽯,与平台⽆关的服务器组件,它是运⾏在 Servlet 容器/Web 应⽤服务器/Tomcat,负责与客户端进⾏通信。 - Servlet 的功能:
1、创建并返回基于客户请求的动态 HTML ⻚⾯。
2、与数据库进⾏通信。 - 如何使⽤ Servlet?
Servlet 本身是⼀组接⼝,⾃定义⼀个类,并且实现 Servlet 接⼝,这个类就具备了接受客户端请求以及
做出响应的功能。
package com.lut.myservlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
public class ServletTset implements Servlet { //实现Servlet 接⼝
@Override
public void init(ServletConfig var1) throws ServletException{
};
@Override
public ServletConfig getServletConfig(){
return null;
};
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException{
String id=servletRequest.getParameter("id");
//在网页地址栏后面输入 ?id=100
System.out.println("我是Servlet,我已经接收到客户端发来的请求,参数是:"+id);//在控制台输出
servletResponse.setContentType("text/html;charset=UTF-8");//使中文可以正常显示/GBK
servletResponse.getWriter().write("我是中文,页面上有显示吗?");//写到页面上
};
@Override
public String getServletInfo(){
return null;
};
@Override
public void destroy(){
};
}
浏览器不能直接访问 Servlet ⽂件,只能通过映射的⽅式来间接访问 Servlet,映射需要开发者⼿动配置,有两种配置⽅式。
- 基于 XML ⽂件的配置⽅式。
<?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">
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.lut.myservlet.myservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/demo02</url-pattern>
</servlet-mapping>
</web-app>
- 基于注解的方式
@WebServlet("/demo01")
public class myservlet implements Servlet {
}
上述两种配置⽅式结果完全⼀致,将 demo2 与 HelloServlet 进⾏映射,即在浏览器地址栏中直接访问demo 就可以映射到 HelloServlet。
地址栏后面输入: /demo01 或 /demo02
3.Servlet生命周期
1、当浏览器访问 Servlet 的时候, Tomcat 会查询当前 Servlet 的实例化对象是否存在,如果不存在,则通过反射机制动态创建对象,如果存在,直接执⾏第 3 步。
2、调⽤ init ⽅法完成初始化操作。
3、调⽤ service ⽅法完成业务逻辑操作。
4、关闭 Tomcat 时,会调⽤ destory ⽅法,释放当前对象所占⽤的资源。
Servlet 的⽣命周期⽅法:⽆参构造函数、 init、 service、 destory
1、⽆参构造函数只调⽤⼀次,创建对象。
2、 init 只调⽤⼀次,初始化对象。
3、 service 调⽤ N 次,执⾏业务⽅法。
4、 destory 只调⽤⼀次,卸载对象。
package com.lut.myservlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/demo01")
public class myservlet implements Servlet {
public myservlet(){
System.out.println("构造函数:创建了Servlet对象");
}
public void init(ServletConfig servletConfig) throws ServletException{
System.out.println("对Servlet对象完成初始化操作...");
};
public ServletConfig getServletConfig(){
return null;
};
public void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException{
System.out.println("执行了Servlet对象的业务方法...");
};
public String getServletInfo(){
return null;
};
public void destroy(){
System.out.println("释放了Servlet对象...");
};
}
4.ServletConfig
该接⼝是⽤来描述 Servlet 的基本信息的。
getServletName() 返回 Servlet 的名称,全类名(带着包名的类名)
getInitParameter(String key) 获取 init 参数的值(web.xml)
getInitParameterNames() 返回所有的 initParamter 的 name 值,⼀般⽤作遍历初始化参数
5.ServletContext
getServletContext() 返回 ServletContext 对象,它是 Servlet 的上下⽂,整个 Servlet 的管理者。
-
ServletConfig 和 ServletContext 的区别:
ServletConfig 作⽤于某个 Servlet 实例,每个 Servlet 都有对应的 ServletConfig,
ServletContext 作⽤于整个 Web 应⽤,⼀个 Web 应⽤对应⼀个 ServletContext,
多个 Servlet 实例对应⼀个ServletContext。
⼀个是局部对象,⼀个是全局对象。
package com.lut.myservlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/demo01")
public class myservlet implements Servlet {
String username;
public myservlet(){
}
public void init(ServletConfig servletConfig) throws ServletException{
//了解
System.out.println(servletConfig.getServletName());
//获取名称 com.lut.myservlet.myservlet
this.username=servletConfig.getInitParameter("username");
//获取初始化参数,不能用注解方式,要用XML,拿XML里面的参数
Enumeration<String> enumeration= servletConfig.getInitParameterNames();
//获取所有参数名的集合
while (enumeration.hasMoreElements()){
String element=enumeration.nextElement();//获取名字
String element2=servletConfig.getInitParameter(element);//获取值
System.out.println(element+" "+element2);
}
//熟知,ServletContext 侧重于全局
ServletContext servletContext = servletConfig.getServletContext();
//拿到整个服务的信息
System.out.println(servletContext.getServletContextName());//名字
System.out.println(servletContext.getContextPath());
//在Tomcat中 Deplayment下Applyaction text
System.out.println(servletContext.getServerInfo());//tomcat版本信息
};
public ServletConfig getServletConfig(){
return null;
};
public void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException{
};
public String getServletInfo(){
return null;
};
public void destroy(){
};
}
<?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">
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.lut.myservlet.myservlet</servlet-class>
<!--初始化参数-->
<init-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
<init-param>
<param-name>type</param-name>
<param-value>super</param-value>
</init-param>
<!--初始化参数-->
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/demo02</url-pattern>
</servlet-mapping>
</web-app>
6.Servlet 的层次结构
Servlet —> GenericServlet —> HttpServlet
HTTP 请求有很多种类型,常⽤的有四种:
GET 读取
POST 保存
PUT 修改
DELETE 删除
GenericServlet 实现 Servlet 接⼝,同时为它的⼦类屏蔽了不常⽤的⽅法,⼦类只需要重写 service ⽅
法即可。HttpServlet 继承 GenericServlet,根据请求类型进⾏分发处理, GET 进⼊ doGET ⽅法, POST 进⼊
doPOST ⽅法。开发者⾃定义的 Servlet 类只需要继承 HttpServlet 即可,重新 doGET 和 doPOST。
1.继承 HttpServlet 的实现
package com.lut.myservlet;
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;
@WebServlet("/test")
public class TestServlet extends HttpServlet {
//通过继承 HttpServlet 实现 servlet 接口
//功能一样,但代码比较简化
//根据不同的请求,自动分发给 GET 和 POST
//处理get(获取)请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello extends HttpServlet");
//super.doGet(req, resp);
resp.getWriter().write("GET");
}
//获取post(保存)请求
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("POST");
//super.doPost(req, resp);
}
//还有 doDelet,doPut 但不常用
}
2.优化Servlet接口的实现(不用)
针对 Servlet接口 代码较长的一种处理方法
1.建一个类 ServletTset 实现 Servlet 接口,重写Servlet中所有的方法
2.建第二个类 ServletTset2 继承 ServletTest,只实现需要的方法
3.建第三个类继承 ServletTest2,只实现 doGet 和 doSet
其实就是模拟 extends HttpServlet 的过程,使用时直接 extends HttpServlet 就好
package com.lut.myservlet;
//***第一层
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo03")
public class ServletTset implements Servlet {
//针对代码较长的一种处理方法
//1.建一个类 ServletTset 实现 Servlet 接口,重写Servlet中所有的方法
//2.建第二个类 ServletTset2 继承 ServletTest,只实现需要的方法
@Override
public void init(ServletConfig var1) throws ServletException{
};
@Override
public ServletConfig getServletConfig(){
return null;
};
@Override
public void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException{
//有用的,其他的不用
//向浏览器中写入数据,不支持中文(需要其他)
var2.getWriter().write("hello implements Servlet ");
};
@Override
public String getServletInfo(){
return null;
};
@Override
public void destroy(){
};
}
package com.lut.myservlet;
//***第二层
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletTest2 extends ServletTset{
//在这里只实现了 service 方法,把其他不用的方法屏蔽掉
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//获取请求对象,这一层继续分发doget ,dopost
//向下转型,获取 ServletRequest 类的子类 HttpServletRequest
HttpServletRequest request=(HttpServletRequest) servletRequest;
HttpServletResponse response=(HttpServletResponse) servletResponse;
//获取请求类型
String method=request.getMethod();
switch (method){
case "GET":
this.doGet(request,response);
break;
case "POST":
this.doPost(request,response);
break;
}
};
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
}
public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException{
}
}
package com.lut.myservlet;
//***第三层
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//模拟 extends HttpServlet 的过程,使用时直接 extends HttpServlet
//继承 ServletTest2,只实现 doGet 和 doSet
@WebServlet("/hello")
public class HelloServlet extends ServletTest2 {
//实现 doGet 和 doSet
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.getWriter().write("helloGet");
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
response.getWriter().write("HelloPost");
}
}