今日内容
零、 复习昨日
一、Servlet
零、 复习昨日
一、Servlet
1.1 Servlet介绍
javaweb开发,就是需要服务器
接收前端发送的请求
,以及请求中的数据,经过处理(jdbc操作),然后向浏览器做出响应
.
我们要想在服务器中写java代码来接收请求,做出响应,我们的java代码就得遵循tomcat开发规范
因此Tomcat提供了开发的规范,就是servlet.
Servlet就是运行在服务器上的程序,可交互式的
接收
服务器的请求
,并可以做出响应
总结Servlet的作用:
- 运行在服务器,是一个服务器端的程序
- 接收客户端请求,向客户端做出响应
- 动态网页(jsp)
1.2 HTTP
Servlet主要做的事情:
接收请求,做出响应
- 接收请求
- 请求是什么? 浏览器通过网络发出的一些请求资源动作
- 哪里发出的请求? a标签href路径,form表单action路径
- 请求都有什么东西可以接收?数据,协议,端口,ip等等
- 做出响应
- 什么是响应? 响应什么东西?服务器返回给浏览器的内容(html页面,json数据等等)
- 响应给谁? 前端(浏览器)
1.2.1 在http请求中有请求报文
通过浏览器的开发者工具(F12)监听任何一个网站的请求响应过程,就可以看到请求报文和响应报文
请求行内有请求方式(GET),和请求路径(/s?wd=java)
ps: 后续就可以通过servlet获得这些数据
1.2.2 在http响应中有响应报文
响应行中有协议(http/1.1) ,响应状态码(200) ,响应信息(OK)
1.3 GET和POST
HTTP中常见的请求方式
- get
- post
1.3.1 GET
GET请求特点:
- 数据会通过浏览器地址栏发送
- 数据量大小有限制,最多4kb
- 请求数据不安全
- 效率相对较高
什么时候用GET请求?
- 一般用于查询数据
前端技术中,如何发送一个get请求?
- form表单指定method=get
- a标签
- 地址栏手动输入
1.3.2 POST
POST请求
- 数据是隐藏的,在地址栏看不见,但是是在请求体中
- 数据量大小不限
- 数据相对安全
- 效率相对较低
开发中建议,使用POST向服务器发送数据,登录,注册,更新,上传文件等
前端技术中,如何发送一个POST请求?
- form表单的method=post
- ajax
二、第一个Servlet程序[重点]
2.1 创建web项目
手动补全目录结构
2.2 pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.qf</groupId><artifactId>day46_servlet</artifactId><version>1.0-SNAPSHOT</version><!-- java项目打包方式是jar包 --><!-- web项目打包方式是war包 --><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><!-- 引入servlet依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><!-- 引入jsp依赖 --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.1</version></dependency></dependencies>
</project>
2.3 编写Servlet
- 继承javax.servlet.HttpServlet类
- 重写方法
- 浏览器发出get请求,那么就重写doGet方法处理get请求
- 浏览器发出post请求,那么就重写doPost方法处理post请求
- 在核心方法doGet/doPost里面完成接收请求,做出响应
package com.qf.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class MyServlet extends HttpServlet {// - 浏览器发出get请求,那么就重写doGet方法处理get请求@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 中文可能乱码,暂时不解决System.out.println("接收请求 - receive request" );String method = req.getMethod( ); // 获得请求方法System.out.println(method );// 通过响应获得输出流,向浏览器响应内容// 其实通过流写出内容PrintWriter out = resp.getWriter( );out.write("hello servlet");}// - 浏览器发出post请求,那么就重写doPost方法处理post请求@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}
2.4 配置Servlet
因为服务器中会有很多servlet,浏览器发请求如何确定访问哪一个servlet类?
此时就需要做一个映射: 请求路径和servlet类的映射,即发出的请求由哪个servlet类来处理
配置需要写在webapp/WEB-INF/web.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_3_1.xsd"
version="3.1"><!-- 在这里写路径和servlet映射 --><servlet><!-- servlet的名字,任意 --><servlet-name>servlet1</servlet-name><!-- servlet的路径 --><servlet-class>com.qf.servlet.MyServlet1</servlet-class></servlet><!-- 请求路径映射 --><servlet-mapping><!-- 该路径映射的servlet名 --><servlet-name>servlet1</servlet-name><!-- 请求路径的模板,一定要/开头 --><url-pattern>/s1</url-pattern></servlet-mapping>
</web-app>
浏览器发出请求,经过web.xml中配置的信息,
- 匹配url-pattern>/s1</url-pattern,有该路径则正常访问,无该路径报404
- 通过servlet-name找到servlet类
- 再通过servlet-class,找到servlet类路径
- 该servlet就可以执行doGet/doPost
2.5 部署项目
web项目已经开发完毕,将项目部署到服务器Tomcat
配置Tomcat
部署项目
2.6 启动
启动项目
2.7 访问
发出http请求进行访问
http://localhost:8080/day46/s1
2.8 解决控制台中文乱码
-Dfile.encoding=utf-8
2.9 解决JSP页面乱码
JSP页面头部加入如下代码即可
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
三、 执行流程分析【理解】
-
启动服务器
-
立即加载解析web.xml文件
1)服务器内就会知道当前服务器能接收哪些请求路径
2)也知道请求路径被哪个servlet处理
3)如果web.xml中有错,启动会失败,要及时查看控制台日志
4)常见的错误就是url-partten写错了
-
启动成功,跳转至index.jsp页面(如果没有该页面,
报错404
) -
浏览器发出请求
1)发出请求路径,根据ip找到服务器,再根据8080找到服务器中的程序
http://localhost:8080
2)然后再通过名字找到服务器中的项目,默认访问首页(index.jsp),找不到报错404
http://localhost:8080/day29
3)然后发出具体的请求路径 http://localhost:8080/day29/a
-
发出的请求会经过web.xml中配置的路径去匹配
1)web.xml中没有匹配到路径,报错404
2)web.xml中有匹配的路径,就找对应的servlet让其执行
-
servlet执行doGet或者doPost方法,完成接收请求,和做出响应的动作
如果后台出问题,主要是指java代码报错,页面会
报错500
四、使用细节
4.1 web.xml中url-partten写错
<!-- 请求路径映射 --><servlet-mapping><!-- 该路径映射的servlet名 --><servlet-name>servlet1</servlet-name><!-- 请求路径的模板,一定要/开头 --><!-- 没有/开头,启动报错 --><url-pattern>s1</url-pattern></servlet-mapping>
Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> s1 in servlet mapping
4.2 首页问题
项目启动,默认访问
webapp
/index.jsp页面没有该页面,启动报404
也可以通过web.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_3_1.xsd"
version="3.1"><!-- 设置欢迎页 --><welcome-file-list><welcome-file>login.html</welcome-file></welcome-file-list><!-- ... -->
</web-app>
4.3 访问路径问题[重点]
现在的访问路径是
http://localhost:8080/day29/
这个访问路径,是在配置Tomcat时给设置的
再访问就是http://localhost:8080/java2217
因为发请求时容易丢失项目名,索性在设置时直接不设置项目名
ps
<%--a标签,form等前端路径以/开头发请求的话,会从浏览器根路径,即从端口出发去请求,如果有项目名的话,就会丢失项目名----------所以,建议在部署项目时,直接不要项目名 --%> <a href="/a">/a-发/a请求</a><br>
4.4 修改端口
启动项目时,idea报错
提示端口占用
作业
1 整个创建-配置-部署-启动servlet过程
2 理解执行流程
3 画出javaweb开发图
4 前端如何发送请求? 浏览器a标签,form表单,手动地址栏输入路径回车
5 前端的请求方法有哪些? get,post地址栏手动输入 - geta标签是 getform指定method=get|post
6 后台有哪些处理不同请求方式的方法?doGetdoPost
7 前端请求通过什么和后台服务器servlet关联?web.xml配置映射路径,后期使用注解
idea设置、IDEA+Maven-jdk版本
修改idea中java版本
Maven-POM文件中设置编译版本
<build><plugins><!-- 编码和编译和JDK版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>
tEb98idl-1700474261978)]
[外链图片转存中…(img-HvI47xQw-1700474261979)]
[外链图片转存中…(img-XcK17s2I-1700474261979)]
Maven-POM文件中设置编译版本
<build><plugins><!-- 编码和编译和JDK版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build>