学习目标
web知识
Tomcat
Servlet
Servlet3.0注解开发
一、Web知识
1、B/S通信模式
B/S架构:又称Browser/Server架构,即浏览器和服务器架构模式
B/S通信模式:
1、基于请求-响应交互模型
客户端浏览器向服务器 发送一个请求
web服务器向客户端浏览器回送 一个响应
一次请求、一次相应
2、必须先有请求 再有响应
3、请求和响应成对出现
2、URL请求路径
URL (Uniform Resource Locator) ,统一资源定位符是对互联网上资源位置的一种表示,互联网上的每个文件都有一个唯一的URL。
格式:
协议://ip:端口号/资源位置
协议,http、https、ftp等
域名,域名或IP地址,能够帮我们定位到互联网上的某一台服务器
端口号,端口号是一个应用程序在一台服务器上的编号。http协议的默认端:80
资源位置,用于描述WEB资源在服务器上的位置
参数=值,浏览器和服务器交互传递的数据。
http协议知识点:
二、Tomcat
1、概述
tomcat服务器是一个免费的开源的web应用服务器。是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现。
下载地址:官网地址:`https://tomcat.apache.org
`
Tomcat:Apache组织提供一个免费开源的小型的服务器软件。支持Servlet和JSP规范,性能高。开源,免费,性能高。
-
WebLogic:Bea公司的一个收费的大型的服务器软件,后被Oracle收购。支持EE的所有的规范
-
WebSphere:IBM公司的一个收费的大型的服务器软件,支持EE的所有的规范。
-
JBoss:是一个基于J2EE的开放源代码的应用服务器。JBoss是一个管理EJB的容器和服务器,JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。
2、安装使用
将下载的zip文件解压后,点击bin/下startup.bat、在浏览器打开http:localhost:8080/就能看到效果了
可以看到如下的目录结构:
目录说明:
bin:脚本目录
启动脚本:startup.bat
停止脚本:shutdown.bat
conf:配置文件目录 (config /configuration)
核心配置文件:server.xml
用户权限配置文件:tomcat-users.xml
所有web项目默认配置文件:web.xml
lib:依赖库,tomcat和web项目中需要使用的jar包
logs:日志文件.
localhost_access_log..txt tomcat记录用户访问信息,..表示时间。
例如:localhost_access_log.2017-04-28.txt
temp:临时文件目录,文件夹内内容可以任意删除。
webapps:默认情况下发布WEB项目所存放的目录。
work:tomcat处理JSP的工作目录。
启动:双击tomcat解压目录/bin/startup.bat 文件即可启动tomcat
访问:tomcat的默认端口为8080,所以在浏览器的地址栏输入:http://ip:8080
即可访问tomcat服务器。
如果想修改端号或配置可以到conf/server.xml中修改
关闭:
1. 关闭startup.bat启动窗口;
2. 双击tomcat的/bin/shutdown.bat文件;
3. Ctrl+C;
3、使用IDEA创建JavaWeb项目
【第一步】 File---New---Project
【第二步】 选择Java Enterprise版本,然后配置tomcat
【第三步】 选择使用模板创建项目
【第四步】 填写项目名,并为这个web项目配置tomcat
【第五步】 创建完成
使用tomcat发布JavaWeb项目
JavaWeb项目开发完成之后,必须发布到tomcat中,并启动tomcat才能够被用户访问到
将web项目复制到tomcat的webapps目录下/如下图
三、Servlet
1、概述
概述:
Servlet 运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态web资源。
Servlet是JavaWeb三大组件之一(Servlet、Filter、Listener),是最重要的组件。
作用:
Servlet 的作用
1. 接收请求 :接收客户端发送的请求数据;
2. 业务逻辑的处理;
3. 响应结果 :将处理结果响应给客户端(浏览器);
2、servlet开发步骤
1. 创建一个普通java类实现Servlet接口;
2. 重写Servelt接口中的所有抽象方法;
3. 注册这个类;
1. 在web.xml中配置这个类的信息;
2. 配置这个类的映射路径;
4. 在service方法中处理请求和响应的业务逻辑;
5. 发布项目,启动项目之后,通过映射路径访问这个类;
演示:
普通java类HelloServlet实现Servlet接口
public class HelloServlet 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("请求过来了。");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
web.xml中配置这个HelloServlet的类路径和映射路径
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.heima.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
访问路径为:http://ip:8080/hello
IDEA显示:
3、Servlet编程优化
方案一:GenericServlet优化方案
说明:
GenericServlet类是一个抽象类,它实现了多个接口,其中有一个是Servlet,
所以它重写了Servlet接口中的所有方法。我们只需要继承GenericServlet类,
重写其中的service方法即可。GenericServlet是一个抽象类,里边只有一个抽象方法service(),
我们继承GenericServlet之后只需要重写service()方法处理具体的业务逻辑即可
分析
1. 创建一个普通的java类继承GenericServlet;
2. 在web.xml中配置这个GenericServlet的子类;
3. 重写service方法,在service方法中完成向浏览器响应数据的功能;
编写一个普通的java类,ServletDemo1,继承GenericServlet
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class Demo2 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("999999999999999999");
}
}
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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.itcat.demos.Demo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/in</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>two</servlet-name>
<servlet-class>com.itcat.demos.Demo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>two</servlet-name>
<url-pattern>/twos</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>three</servlet-name>
<servlet-class>com.itcat.demos.Demo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>three</servlet-name>
<url-pattern>/threes</url-pattern>
</servlet-mapping>
方案二:HttpServlet优化方案
在实际的生活中,客户端(浏览器)给我们发送的请求往往是HTTP协议下的请求,
所以我们只需要处理HTTP的请求和响应即可。也就是说我们需要的知识一个与HTTP协议相关的Servlet。
Sun公司为我们提供了HttpServlet,对GenericServlet再次进行扩展和功能加强。
实际开发中:我们编写Servlet就可以采用 继承HttpServlet来完成servlet的开发,
这样的Servlet我们可以获取更多的业务功能。
HttpServlet是GenericServlet的一个子类。这个类是专门帮我们处理与HTTP协议相关的请求与响应的一个Servlet类,它里边的方法如下
说明:
HttpServlet继承了GenericServlet,功能比GenericServlet更强大
HttpServlet类中的方法参数为HttpServletRequest对象和HttpServletResponse对象。
使用这两个对象的好处在于:
1. HttpServletRequest继承了ServletRequest,HttpServletResponse继承了ServletResponse。
功能更强大;
2. HttpServletRequest和HttpServletResponse为我们提供了很多处理HTTP协议相关的API,
HTTP协议正是我们日常生活中使用得比较多的一种协议;
演示:
package com.itcat.demos;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Demo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("处理get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("处理Post请求");
}
}
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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.itcat.demos.Demo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/in</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>two</servlet-name>
<servlet-class>com.itcat.demos.Demo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>two</servlet-name>
<url-pattern>/twos</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>three</servlet-name>
<servlet-class>com.itcat.demos.Demo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>three</servlet-name>
<url-pattern>/threes</url-pattern>
</servlet-mapping>
4、Servlet生命周期
1. 谁创建:tomcat创建;
2. 何时创建:第一次访问这个Servlet的时候,只创建一次,创建完成后会调用init()方法;
3. 如何工作:每次请求到这个Servlet时,由service方法处理请求和响应信息;
4. 何时销毁:服务器正常关闭,销毁前会调用destory()方法;
小结:
1. Servlet对象的创建:
1. 创建者:tomcat;创建时机:在Servlet第一次被访问的时候;
2. 特点:
1. 只会创建一次(单例);
2. 对象创建完成之后,会调用init()方法;
2. Servlet运行:
1. service()方法接收用户的请求,和处理响应;
2. 特点:
1. 每次对这个Servlet的访问都会由service()方法来处理;
2. service()方法的两个参数:request和response对象专门用来处理请求和响应;
3. Servlet销毁:
1. Servlet对象在服务器正常关闭的时候销毁;
2. 特点:
1. 销毁的时候会调用destory()方法;
5、Servlet映射规范
url-pattern中的映射路径配置存在以下几种方式:
1. 完全匹配 /user/hello 资源路径为/user/hello时可以访问
2. 目录匹配 /user/* 资源路径中含有/user目录均可访问
3. 后缀名匹配 *.do 资源路径中以.do结尾的均可访问
4. 缺省路径 / 访问的路径找不到,就会去找缺省路径
tomcat获得匹配路径时,优先级顺序:1 >2 > 3 > 4
四、Servlet3.0注解开发
1、概述
Servlet3.0新特性
-
注解支持
该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。
-
支持web模块(servlet filter Listener)
-
支持Servlet异步处理
-
文件上传API简化
2、IDEA创建3.0版本的Servlet
建完成后,Servlet类上面会默认添加一个注解@WebServlet(name="Servlet3Demo")
。这个@WebServlet
注解就是用来配置当前这个Servlet的。这个注解中常用的有两个属性:
-
name属性: 相当于web.xml的 <servlet-name>;
-
urlPatterns属性: 编写访问servlet的路径 类似于 <url-pattern>
package com.itcat.serlat;
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(name = "Servletdemo")
public class Servletdemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
3、Servlet开发最终版本
优化一:在doPost方法中调用doGet方法。这样我们的代码都在goGet()方法里写就可以了
package com.itcat.serlat;
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(name = "Servletdemo")
public class Servletdemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
最终版:改模版:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebServlet("/${Entity_Name}")
public class ${Class_Name} extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
doGet(request,response);
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
}
}
Servlet开发最终版:
package com.base.demo;
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("/Servletdemo1")
public class Servletdemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}