Servlet
引言
1.C/S架构和B/S架构
- c/s和b/s架构是软件发展过程中出现的两种软件架构方式
1.2 C/S架构(Client/Server 客户端/服务端)
- 特点:必须在客户端安装特定软件
- 优点:图形效果显示较好(如:3d游戏)
- 缺点:服务器的软件和功能进行升级,客户端也必须升级,不利于维护
- 常见的c/s程序:qq,微信等
1.3 B/S架构(Browser/Server 浏览器/服务器)
- 特点:无需安装客户端,任何的浏览器都可以直接访问
- 优点:涉及到功能的升级,只需要升级服务器端
- 缺点:图形显示效果不如C/S架构
- 需要通过HTTP协议访问
服务器
1.概念
1.1 什么是web
- web称为万维网,简单理解就是网站,他用来表示internet主机上供外界访问的资源
- Internet上供外界访问资源分为两大类
- 静态资源:指Web页面供人们浏览的数据始终是不变的(html,css)
- 动态资源:指web页面供人们浏览的数据由程序产生,不同时间点,甚至不同设备访问web页面看到的内容各不相同(jsp/servlet)
- 在java中,动态web资源开发技术我们统称java web
1.2 什么是web服务器
- web服务器是运行及发布web应用的容器,只有将开发的web项目放置到容器中,才能使网络中的所有用户通过浏览器访问
2.常见的服务器
- 开源:OpenSource(开放代码,免费)
- Tomcat(主流的web服务器之一,适合初学者)
- jetty(淘宝,运行效率逼tomcat高)
- resin(新浪,所有开源服务器软件中,运行效率最高)
- 三者用从代码角度完全相同,只有在开启,关闭服务器软件时对应的命令稍微有点区别,掌握一个即可掌握所有
- 收费
- WebLogic(Oracle)
- WebSphere(IBM)
- 提供相应的服务与支持,软件大,耗资源
3.Tomcat
- Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,免费开源,并支持Servlet和JSP规范
- Tomcat技术先进,性能稳定,深受java爱好者喜爱并得到了部分软件开发商的认可,称为目前比较流行的Web应用服务器
4.Tomcat安装
4.1 下载
4.2Tomcat目录结构
文件夹 说明 | 备注 | |
---|---|---|
bin | 该目录下存放的是二进制可执行文件 | startup.bat启动tomcat,shutdown.bat停止Tomcat |
conf | 这是一个非常重要的目录,这个目录下有两个最为重要的文件server.xml和web.xml | server.xml:配置整个服务器的信息,例如修改端口号,编码格式等 web.xml:项目部署描述附文件,这个文件中中注册了很多mime类型,即文档类型 |
lib | Tomcat的类库,里面存放Tomcat运行所需要的jar文件 | |
logs | 存放日志,记录Tomcat启动和关闭的信息,如果启动·tomcat时有错误,异常也会记录在日志文件 中 | |
temp | 临时文件,这个目录下的东西在停止tomcat会删除 | |
webapps | 存放web项目的的时候,其中每个文件夹都是一个项目;其中ROOT是一个特殊的项目,在地址栏没有给出项目目录时,对应的就是ROOT项目 | |
work | 运行时生成的文件,最终运行的文件都在这里 | 当客户端用户访问一个jsp文件时,Tomcat会通过jsp生成java文件,然后再编译java文件生成class文件,生成的java和class文件都会存放在这里 |
5.Tomcat启动和停止
- 双击startup.bat启动tomcat,shutdown.bat停止Tomcat
5.1 修改端口号
- Tomcat默认的端口号是8080,可以通过conf/server.xml文件修改
- 注意:修改端口号需要重新启动tomcat才能生效
6.项目部署及静态资源访问
- Tomncat是Web服务器,我们的项目应用是在webapps下,然后通过特定的url访问
6.1 创建项目
- 在Webapps中建立文件夹(项目应用)比如:myweb
- 创建WEB-INF文件夹,用于存放项目核心内容
- 创建classes,用于存放.class文件
- 创建lib,用于存放jar文件
- 创建web.xml,项目配置文件(到ROOT项目下的WEB-INF复制即可)
- 把网页hello.html复制到myweb文件夹中,与WEB-INF同级目录
- 创建WEB-INF文件夹,用于存放项目核心内容
6.2 url访问资源
- 浏览器地址中输入url:http://localhost:8080/myweb/hello.html
- 经验URL主要有4部分组成:协议,域名/主机,端口,资源路径
6.3 Tomcat响应流程图
7.常见错误
7.1 Tomcat闪退
- 闪退问题是由于JAVA_HOME配置导致的,检查JAVA_HOME配置是否正确
7.2 404
- 访问资源不存在,出现404错误
Servlet【重点】
1.概念
- Servlet:Server Applet的简称,是服务器端的程序(代码,功能实现),可交互式的处理客户端发送到服务器端的请求,并完成操作请求
- 动态网页技术
- JavaWeb程序开发的基础,JavaEE规范(一套接口)的一个组成部分
1.1 Servlet作用
- 接收客户端发来的请求,完成操作
- 动态生成网页·(网页数据可变)
- 将包含操作结果的动态网页响应给客户端
2.Servlet开发步骤
2.1 搭建开发环境
- 将Servlet相关的jar包(lib/servlet-api.jar)配置到classpath中
2.2 编写Servlet
- 实现javax.servlet.Servlet
- 重写5个主要方法
- 在核心的service()方法中编写输出语句,打印访问结果
2.3 部署Servlet
- 编译MyServlet后,将生成的.class文件放在WEB-INF/classes文件中
2.4 配置Servlet
- 编写WEB-INF下项目配置文件web.xml
- 注意:url-pattern配置的内容就是浏览器地址栏输入的URL中项目名称后资源的内容
3.运行测试
- 启动Tomcat,在浏览器地址栏输入:http://localhost:8080/myweb/myservlet访问,在Tomcat中打印时间表示成功
4.常见错误
4.1 500
- 服务器端出现异常
IDEA开发web项目
1.web项目结构目录
2.IDEA开发Sevlet
- 使用开发工具编写Servlet,仍要手工导入servlet-api.jar文件,并与项目关联
2.1 编写Servlet
- 创建MyServlet,实现Servlet接口,覆盖5个方法
public class MyServlet 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("this is first webpproject");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2.2 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>my</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
</web-app>
2.3 部署Web项目
- 在Tomcat的webapps目录下,新建WebProject项目文件夹
- 创建WEB-INF,存放核心文件
- 在WEB-INF,创建classes文件夹,将编译后的MyServlet文件复制至此
- 问题:每当我们编写了新的Servlet或者重新编译,都需要手工将新的.class部署到Tomcat中,较为麻烦,就需要实现自动部署
3.IDEA部署Web项目
- 前面我们是在Tomcat的webapps目录新建应用程序目录myweb,然后把静态资源和Servlet复制到相关目录下,使用IDEA不需要我们复制了,可以通过IDEA集成Tomcat服务器,实现自动部署
3.1 如何导出war包
- 项目完成后,有时候要打包成war方便部署,war包可以直接放入Tomcat的webapps目录中,启动Tomcat后自动解压,访问即可
点击Build,完成导出
HTTP协议
1.什么是HTTP
- 超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个基于请求与响应模式,无状态的,应用层协议,运行于TCP协议基础上
2.HTTP协议特点
- 支持客户端(浏览器)/服务器模式
- 简单快速:客户端只向服务器发送请求方法和路径,服务器即可响应数据,因而通信速度很快,请求方法常用的有get,post等
- 灵活:HTTP允许传输任意类型数据,传输的数据类型由Content-Type标识
- 无连接:无连接指的是每次TCP连接只处理一个或多个请求,服务器处理完客户请求后,即断开连接,采用这种方式可以节省传输时间
- HTTP1.0版本是一个请求响应之后,直接就断开了,称为短连接
- HTTP1.1版本不是响应后直接就断开了,而是等几秒,这几秒之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒没有用户发送新的请求,就会断开连接,称为长连接
- 无状态:HTTP协议是无状态协议
- 无状态是指协议对于事务处理没有记忆能力
3.HTTP协议通信流程
- 客户端与服务器建立连接(三次握手)
- 客户端向服务器发送请求
- 服务器接收请求,并根据请求返回相应的文件作为应答
- 客户与服务器关闭连接(四次挥手)
4.请求报文和响应报文(了解)
HTTP请求报文
- 当浏览器向web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息(请求报文),HTTP请求信息由4部分组成
1.请求行 请求方法/地址 URL协议/版本
2.请求头(Request header)
3.空行
4.请求正文
HTTP响应报文
- HTTP响应报文与HTTP请求报文相似,HTTP响应也由4个部分组成
1.状态行
2.响应头(Response Header)
3.空行
4.响应正文
5.常见状态码
状态代码 | 状态描述 | 说明 |
---|---|---|
200 | ok | 客户端请求成功 |
302 | Found | 临时重定向 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务,服务器通常会在响应正文中给出不提供服务的原因 |
404 | Not Found | 请求的资源不存在,例如:输错了URL |
500 | Internal Server Error | 服务器发生不可预期的错误,导致无法完成客户端的请求 |
Servlet详解(重点)
1.Servlet核心接口和类
- 在Servlet体系结构中,除了实现servlet接口之外,还可以通过继承GenericServlet或HttpServlet类,完成编写
1.1 Servlet接口
- 在servlet API中最重要的是Servlet接口,所有的Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类。
该接口包含以下5中方法:
public class MyServlet 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 {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
1.2 GenericServlet抽象类
- GenericServlet使编写Servlet变得容易,他提供生命周期方法init和destroy的简单实现,要编写的一般的Servlet,只需要重写抽象service方法即可
1.3 HttpServlet类
- HttpServlet是继承GenericServlet的基础上进行一步的扩展。
- 提供将要被子类实例化以创建适用于WEB站点的HTTP servlet的抽象类,HTTPServlet的子类至少要重写一个方法,该方法通常是一下这些方法之一:
- doGet,如果servlet支持HTTP GET请求
- doPost,用于HTTP POST请求
- doPut,用于HTTP PUT请求
- doDelete,用于HTTP DELETE请求
2.Servlet的两种创建方式
2.1 实现接口Servlet
public class MyServlet 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 {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
- 这种方法比较麻烦需要实现接口中的所有方法
2.2 继承HttpServlet类
public class MyHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet方法");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost方法");
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPut方法");
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doDelete方法");
}
}
2.3 常见的错误
- HTTP Status 404 :资源找不到
- 第一种情况:地址书写错误
- 第二种情况:地址没问题,把IDEA项目中out目录删除,然后重新运行
- Servlet地址配置重复:
- Servlet地址配置错误:
3.Servlet两种配置方式
3.1 使用web.xml(Servlet2.5之前使用)
- url-pattern定义匹配规则,取值说明:
- 精确匹配 /具体的名称 只有url路径是具体的名称的时候才会除法Servlet
- 后缀匹配 *.xxx 只要是以xxx结尾的就匹配触发Servlet
- 通配符匹配 /* 匹配所有的请求,包含服务器的所有资源
- 通配符匹配 / 匹配所有请求,包含服务器的所有资源,不包括.jsp
- load-on-startup
1.元素标记容器是否应该在web应用程序启动的时候就加载这个servlet
2.他的值必须是一个整数,表示servlet被加载的先后顺序
3.如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载
4.如果值为正整数或者0时,表示容器在应用启动的时候就会加载并初始化这个Servlet。值越小,servlet的优先级越高,就越先被加载,值相同时,容器就会自己选择顺序来加载
3.2 使用注解(Servlet3.0后支持,推荐)
@WebServlet(value = {
"/o","/se"},loadOnStartup = 0)
public class BasicServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是post方法");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是get方法");
}
}
3.3 @WebServlet注解常用属性
- name:Servlet名字 (可选)
- value:配置url路径,可以配置多个
- urlPatterns:配置url路径,和value一样,不可以同时使用
- loadOnStartup:配置Servlet的创建时机,如果是0或者是正数 启动程序的时候创建,否则访问时创建。数值越小优先级越高
Servlet应用(重点)
1.request对象
- 在Servlet中用来处理客户端请求需要用doGet或doPost方法的request对象
1.1 get和post区别
- get请求
- get提交的数据会放在url之后,以?分割url和传输数据,参数之间以&相连
- get方式明文传递,数据量小,不安全
- 效率高,浏览器默认请求方式为get请求
- 对应的Servlet的方法是doGet
- post请求
- post方法是把提交的数据放在HTTP包的Body中
- 密文传递数据,数据量大,安全
- 效率相较于get低
- 对应的Servlet方法是doPost
1.2 request主要方法
方法名 | 说明 |
---|---|
String getParameter(String name) | 根据表单组件名称获取提交数据 |
void setCharacterEnconding(String charset) | 指定每个请求的编码 |
1.3 request的应用
@WebServlet(value = "/rs")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取用户发送的数据
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("提交的数据为:"+username+"\t"+password);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<form action="/rs" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
1.4 get请求收参问题
- 产生乱码是因为服务器和客户端的编码不一致导致的,因此解决的办法是:客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收
1.5 get中文乱码
- 在tomcat7及以下版本,客户端以utf-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端编码不一致因此才会导致乱码
- 解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题
- tomcat8的版本中get方式就不会出现乱码了,因为服务器对url的编码格式可以进行自动转换
- 解决中文乱码
1.6 post中文乱码
- 由于客户端是以utf-8字符编码将表单数据传输到服务器端的,因此服务器也是需要设置以utf-8字符编码进行接收
- 解决方案:使用ServletRequest接口继承而来的 setCharacterEnconding(String charset) 方法进行统一的编码设置
@WebServlet(value = "/rs")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取用户发送的数据
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("提交的数据为:"+username+"\t"+password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置request请求对象设置统一编码
req.setCharacterEncoding("utf-8");
//获取用户发送的数据
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("提交的数据为:"+username+"\t"+password);
}
}
2.response对象
- response对象用于响应客户请求并向客户端输出信息
2.1 response主要方法
方法名称 | 作用 |
---|---|
setHeader(name,value) | 设置响应信息头 |
setContentType(String) | 设置响应文件类型,响应式的编码格式 |
setCharacterEncoding(String) | 设置服务端响应内容编码格式 |
getWriter() | 获取字符输出流 |
@WebServlet(value = "/rs")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取用户发送的数据
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("提交的数据为:"+username+"\t"+password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置request请求对象设置统一编码
req.setCharacterEncoding("utf-8");
//获取用户发送的数据
String username = req.getParameter("username");
String password = req.getParameter