0、Servlet介绍
概念:
- JavaEE的规范之一【JavaEE提供的接口】
- 全名Servlet Applet,是JavaWeb提供的三大组件之一
【JavaWeb三大组件:Servlet程序、Filter过滤器、Lstener监听器】
- Servlet程序是实现Servlet接口,运行在服务器端的Java程序。本质上是一个Java类
- Servlet对象的创建、运行和销毁通过容器管理【一般是web服务器:Tomcat】
- 每一个Servlet对象对应一个请求【两个浏览器向服务器发送相同的请求,tomcat会创建两个Servlet对象分别处理请求】
作用:
- 通过HTTP协议接收客户端数据、处理请求、完成响应
- 动态生成网页
1、创建Web工程
1-1、使用IDEA Ultimate版本
新建项目——选择Java Enterprise——项目名称——项目地址——项目使用的模板为Web application——项目服务器【已经配置的tomcat】
项目构建系统:默认Maven
项目语言默认Java
单元测试:默认JUnit
域名:默认
打包后名称:默认
SDK:选择使用的JDK
?选择JavaEE版本——因为使用的JDK11和最新版本的Tomcat,因此选择JavaEE9
?生成的工程目录:包含一个Servlet+JSP+web.xml+maven.xml
1-2、使用IDEA??Community版本
方式1:【借助Maven田间tomcat插件:最多的版本是Tomcat7,有Tomcat8-很难找到】
方式2:【借助IDEA插件smarttomcat】
新建项目——使用Maven——指定SDK为JDK——勾选Create from archetype——选择maven-archetype-webapp[选中后下方提示为:a simple java web application]
?在maven界面新增参数:archetypeCatalog=internal
不加参数默认值为remote、local,使用中央仓库的元数据——加载速度非常慢
生成的项目结构
修改pom.xml? ?在plugins节点增加子节点:plugin? ? 添加tomcat插件信息
<!--增加Tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
</plugin>
使用add Configuration配置:+号? 选择maven
?编辑名称为tomcat——Command line参数——tomcat7:run
?点击运行
?等待加载完毕,浏览器输入地址:localhost:8080? ?即可看到项目中jsp页面内容
仿照Ultimate构建应用结构:需要将新建的java文件夹设置为source root 新建的resource设置为resource root
【设置文件夹后会导致浏览器不能访问:尚未解决】
2、运行模板给定的Web App
》》》注意使用JDK11,一定要选JavaEE9? ?===否则按照要求使用JDK8 + JavaEE8
点击超链接,即可发送请求访问Servlet
?之后测试Servlet访问状态——建议使用页面超链接的方式【而不是直接在浏览器地址中访问】
3、访问自己的Servlet
3-1、Servlet编码
3-1-1、通过实现Servlet接口【JavaEE规范】
实现接口规定的5种方法
package com.example.demo;
import jakarta.servlet.*;
import java.io.IOException;
public class ServletTest implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("容器生成Servlet对象时调用的方法");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("对外提供获取Servlet配置的方法");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet接受请求并响应的核心方法");
}
@Override
public String getServletInfo() {
System.out.println("对外提供获取Servlet信息的方法");
return null;
}
@Override
public void destroy() {
System.out.println("容器销毁Servlet对象时,调用的方法");
}
}
3-1-2、通过继承GenericServlet【只对外暴露Service方法】
package com.example.demo;
import jakarta.servlet.*;
import java.io.IOException;
public class ServletTest extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("通过继承实现的servlet只暴露service方法");
}
}
3-1-3、通过继承HtpServlet【通过重写Doget、DoPost区分;两种不同的请求】
package com.example.demo;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
System.out.println("通过重写DoGet方法,可以单独响应页面的get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
System.out.println("通过重写DoPost方法,可以单独响应页面的Post请求");
}
}
3-2、注册和配置Servlet访问路径
注册和配置servlet的方法有两种:
注解:与源码充分绑定,是一种分散的元数据
xml:不与源码绑定,是一种集中式的元数据
注解的缺点:分散在源码中不易维护和管理【借助工具会好些】;注解的开启和关闭需要修改源码【需要耦合的,例如数据源等建议使用xml】;注解缺乏灵活性【要么用、要么不用只有确定的两种状态】【一般的配置文件,建议使用xml配置文件,可拓展性和复杂性、可维护性更高;注解的扫描机制较差】
注解的好处:【约定大于配置的原则:注解用于复杂情况下的数据验证和绑定】【xml的配置相对冗长,注解能够简化配置,提高开发效率】【注解比xml更加类型安全,xml只有在运行时才能发现问题】
3-2-1、使用web.xml配置
文件地址:
?每一个Servlet在<web-app>根节点下新增两个子节点
<servlet>:用来注册servlet
<servlet-mapping>:用来确认Servlet的访问url
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<!--在web.xml中注册servlet-->
<servlet>
<!--给servlet取别名,一般建议直接使用类名-->
<servlet-name>MyServlet</servlet-name>
<!--.java源文件的全类名,不包含后缀-->
<servlet-class>com.example.demo.MyServlet</servlet-class>
</servlet>
<!--在web.xml中确定servlet访问url-->
<servlet-mapping>
<!--使用注册时使用的别名-->
<servlet-name>MyServlet</servlet-name>
<!--新手阶段使用斜杠+和servlet类名关联性高的单词。-->
<!--项目内可以直接使用[不加斜杠],转到servlet-->
<!--外界需要在前面加上项目的访问地址 练习阶段为http;//localhost:8080/项目打包名/MyServlet-->
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
</web-app>
3-2-2、使用注解
@WebServlet 注解中的参数详解
package com.example.demo;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name="MyServlet",value="/MyServlet")
public class ServletTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
System.out.println("通过重写DoGet方法,可以单独响应页面的get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
System.out.println("通过重写DoPost方法,可以单独响应页面的Post请求");
}
}
3-3、在jsp中设置超链接到新建的Servlet进行访问测试
测试用Servlet:设置了字符串的字符集,避免中文发送到浏览器页面乱码
package com.example.Demo;
/**
* @author: Chen Stormrage
* @date: 2021/7/27 21:48
* @description:
*/
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "MyServlet", value = "/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("浏览器发送了Get请求[该字符串显示在控制台]");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
writer.println("Servlet响应了Get请求,向浏览器发送了这条信息[显示在浏览器]");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("浏览器发送了Post请求[该字符串显示在控制台]");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
writer.println("Servlet响应了Post请求,向浏览器发送了这条信息[显示在浏览器]");
}
}
?JSP编码
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<h1><%= "Hello World!" %>
</h1>
<br/>
<a href="hello-servlet">Hello Servlet</a>
<br>
<a href="MyServlet">This is MyServlet!</a><!--测试用超链节,这里不使用同斜杠-->
</body>
</html>
?3-4、Servlet中中文在控制台乱码处理
设置IDEA全局UTF-8:如果已经存在项目,运行有乱码,需要重启IDEA
IDEA file encoding设置【当前项目和新项目一共两处】
IDEA VM Option设置
tomcat设置
?访问结果:
?访问This is MyServlet超链接,浏览器页面
?
??访问This is MyServlet超链接,控制台输出
4、通过url访问servlet的原理
|