JavaWEB-Servlet
1.Web流程
1.1 软件架构
1. C/S:客户端/服务器端
cs架构建立在专用的网络上,一般面向相对固定的用户群,它可以对权限进行多层次校验,提供了更安全的存取模式,对信息安全的控制能力很强;
- B/S:浏览器/服务器端
bs架构建立在广域网之上,面向是不可知的用户群,对安全的控制能力相对弱。
1.2 资源分类
1. 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源.静态资源可以直接被浏览器解析,如: html,css,JavaScript
2. 动态资源:每个用户访问相同资源后,得到的结果可能不一样。称为动态资源。动态资源被访问后,需要先转换 为静态资源,在返回给浏览器,如:servlet/jsp,php,asp....
1.3 网络通信三要素
1. IP:电子设备(计算机)在网络中的唯一标识。
2. 端口:应用程序在计算机中的唯一标识。 0~65536
3. 传输协议:规定了数据传输的规则
基础协议:
1. tcp:安全协议,三次握手。 速度稍慢
2. udp:不安全协议。 速度
1.4 流程图
1.前端发送请求,根据路径信息,访问后台接口。
请求路径中,包含 协议、ip地址、端口号、路径
通过ip地址找到服务器
通过端口号,找到web服务器程序
通过具体路径,找到执行的代码
2.后端接收到请求后,进行处理,处理完成后,向前端返回响应。
3.后端处理时,会通过和数据库交互,完成数据的操作。
2.Web服务器软件
2.1概念
服务器:安装了服务器软件的计算机。
服务器软件:接收用户的请求,处理请求,做出响应。
web服务器软件:接收用户的请求,处理请求,做出响应。
在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目,实际上可以理解为web容器。
2.2常见的与java相关的服务器软件
1.webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。 2.webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
3.JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
4.Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范 servlet/jsp。开源的,免费的。
2.3 Tomcat
1. 介绍
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
2. 下载安装与卸载
官网下载:http://tomcat.apache.org/
安装:解压压缩包即可
* 注意:安装目录建议不要有中文和空格
卸载:删除目录就行了
参考 相关软件/TomCat安装和使用.docx 进行安装测试即可
3.目录介绍
4. 启动 访问 关闭
启动:bin/startup.bat ,双击运行该文件即可
访问:浏览器输入http://localhost:8080 回车访问自己 http://别人的ip:8080 访问别人
关闭:bin/shutdown.bat,双击运行该文件即可
5. 修改端口号
Conf目录下的server.xml文件中,找到
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
修改8080为想要的端口即可
因为在服务器上部署了多个Tomcat,要使用不同的端口号,可是修改后重新启动项目后又会回到之前的端口号,如何解决?
方法:1.先在tomcat的启动处bin--》startup.bat中将if not "%CATALINA_HOME%" == "" goto gotHome注释掉(这里的注释得用rem )。
2.再在conf----》server.xml中将中间的8080端口改成你自己设定的端口。
3.重新启动就好了。
Tomcat控制台乱码
-->Windows默认编码是GBK,而Tomcat默认编码是UTF-8,需要将Tomcat的编码改为GBK
--> 在Tomcat目录的conf目录下找到logging.properties文件,将java.util.logging.ConsoleHandler.encoding改为GBK
- 目项目部署
1、方式一
直接将项目放到webapps目录下即可。
简化部署:将项目打成一个war包,再将war包放置到webapps目录下。 * war包会自动解压缩
- 方式二
找到 Tomcat 下的 conf 目录\Catalina\localhost\ 下,创建如下的配置文件.
abc.xml 配置文件内容如下:
<!-- Context 表示一个工程上下文
path 表示工程的访问路径:/abc
docBase 表示你的工程目录在哪里
-->
<Context path="/abc" docBase="E:\book" />
访问这个工程的路径如下:http://ip:port/abc/ 就表示访问 E:\book 目录
3.Servlet
3.1 概述
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet 理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用 来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。
什么是Servlet?
1、Servlet是JavaEE 规范之一。规范就是接口
2、Servlet是JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
3.2 快速入门
1. idea中创建web项目
参考有道云笔记-idea使用指南,链接如下:
http://note.youdao.com/noteshare?id=48569c74ce3c409c3ac921b1c00ed425&sub=6A790066C9734EC18A9BF90D99548AAC
2. 创建servlet
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法
3、到 web.xml 中的配置 Servlet 程序的访问地址
Servlet类中的代码
public class HelloServlet_01 extends HttpServlet {
/**
* doGet()在 get 请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet_01中的doGet方法");
}
}
/**
* doPost()在 post请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet_01中的doPost方法");
}
web.xml中的配置
<servlet>
<servlet-name>HelloServlet1</servlet-name>
<servlet-class>com.tledu.servlet.HelloServlet_01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet1</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
演示示例:_01_HelloServlet
练习以上程序
3. 执行原理
3.3 生命周期
Servlet生命周期就是从创建Servlet对象开始一直到死亡的一个执行过程
1 先执行构造方法,用于创建Servlet对象
2 执行init()方法做初始化操作
3 执行service()/doGet()/doPost()方法处理真正的逻辑操作和数据交互
4 执行destroy()方法进行资源释放和销毁
演示示例:_02_ServletLife
通过上面示例可以看出,默认是第一次请求的时候,对servlet进行初始化,第一次请求才会执行构造方法和init方法以及service方法
再次请求就只会执行service方法
当然我们也可以通过web.xml中的配置,设置在启动TomCat的时候就初始化servlet
使用 load-on-startup 可以设置初始化的时机
<servlet>
<servlet-name>_02_ServletLife</servlet-name>
<servlet-class>com.tledu.servlet._02_ServletLife</servlet-class>
<!-- 设置servlet初始化的时机,默认是 -1,在第一次请求的时候初始化 -->
<!-- 0 和 正整数都是在加载的时候启动,启动TomCat的时候 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>_02_ServletLife</servlet-name>
<url-pattern>/s</url-pattern>
</servlet-mapping>
3.4 ServletConfig类
ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类。Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时就会创建一个对应的 ServletConfig 对象。
- ServletConfig类的三大作用
1、可以获取 Servlet 程序的别名 servlet-name 的值
2、获取初始化参数 init-param
3、获取 ServletContext 对象
web.xml 中的配置:
<servlet>
<servlet-name>HelloServlet1</servlet-name>
<servlet-class>com.tledu.servlet.HelloServlet_01</servlet-class>
<!--init-param 是初始化参数-->
<init-param>
<!--是参数名-->
<param-name>username</param-name>
<!--是参数值-->
<param-value>root</param-value>
</init-param>
<!--init-param 是初始化参数-->
<init-param>
<!--是参数名-->
<param-name>url</param-name>
<!--是参数值-->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet1</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
Servlet中的代码
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init 初始化方法");
//
1、可以获取 Servlet 程序的别名 servlet-name 的值
System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
//
2、获取初始化参数 init-param
System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
//
3、获取 ServletContext 对象
System.out.println(servletConfig.getServletContext());
}
3.5 ServletContext类
1.什么是ServletContext
1、ServletContext 是一个接口,它表示 Servlet 上下文对象
2、一个 web 工程,只有一个 ServletContext 对象实例。
3、ServletContext 对象是一个域对象。
4、ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。
什么是域对象?
域对象,是可以像 Map 一样存取数据的对象,叫域对象。
这里的域指的是存取数据的操作范围,整个 web 工程。
存数据 取数据 删除/数据
Map put() get() remove()
域对象 setAttribute() getAttribute() removeAttribute();
2.ServletContext的四个作用
1、获取 web.xml 中配置的上下文参数 context-param
2、获取当前的工程路径,格式: /工程路径
3、获取工程部署后在服务器硬盘上的绝对路径
4、像 Map 一样存取数据
ServletContext 演示代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
//
1、获取 web.xml 中配置的上下文参数 context-param
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
System.out.println("context-param 参数 username 的值是:" + username);
System.out.println("context-param 参数 password 的值是:" +
context.getInitParameter("password"));
//
2、获取当前的工程路径,格式: /工程路径System.out.println( "当前工程路径:" + context.getContextPath() );
//
3、获取工程部署后在服务器硬盘上的绝对路径
/**
* / 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA 代码的 web 目录<br/>
*/
System.out.println("工程部署的路径是:" + context.getRealPath("/"));
System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));
}
web.xml 中的配置:
<!--context-param 是上下文参数(它属于整个 web 工程)-->
<context-param>
<param-name>username</param-name>
<param-value>context</param-value>
</context-param>
<!--context-param 是上下文参数(它属于整个 web 工程)-->
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
ServletContext 像 Map 一样存取数据:
ContextServlet1 代码:
public class ContextServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取 ServletContext 对象
ServletContext context = getServletContext();
System.out.println(context);
System.out.println("保存之前: Context1 获取 key1 的值是:"+ context.getAttribute("key1"));
context.setAttribute("key1", "value1");
System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));
}
}
ContextServlet2 代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
System.out.println(context);
System.out.println("Context2 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));
}
3.6 HTTP协议
1.什么是Http协议
协议是指双方或多方相互约定好,大家都需要遵守的规则叫协议。
所谓 HTTP 协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫 HTTP 协议。HTTP 协议中的数据又叫报文。
2.Http协议格式
客户端给服务器发送数据叫请求。
服务器给客户端回传数据叫响应。
请求又分为 GET 请求,和 POST 请求两种
- GET 请求
1、请求行
(1) 请求的方式 GET
(2) 请求的资源路径 [+?+请求参数]
(3) 请求的协议的版本号 HTTP/1.1
2、请求头
key : value 组成 不同的键值对,表示不同的含义。
- POST 请求
1、请求行
(1) 请求的方式 POST
(2) 请求的资源路径 [+?+请求参数]
(3) 请求的协议的版本号 HTTP/1.1
2、请求头
1) key : value
不同的请求头,有不同的含义
空行
3、请求体 ===>>> 就是发送给服务器的数据