一.是什么
1. 概述
servlet是sun公司用来开发动态web的技术,sun公司在API中提供的接口就叫servlet, 在java中也可以说,把实现了servlet接口的java程序叫做servlet(本质就是java程序)
二.为什么用
因为web服务器(tomcat、Weblogic、iis、apache)**没有处理动态资源请求的能力**(即该请求需要计算),只能处理静态资源的请求(如果浏览器请求某个html页面,web服务器查看请求的html页面是否存在,存在则返回。)如果要让web服务器处理动态资源的请求,则需要使用CGI组件加容器的方式。
Servlet就是web服务器处理动态资源的具体实现。
三.怎么用
1.开发servlet程序,需要两步:
<1>.编写一个类,实现servlet接口
<2>.把开发好的java类部署到web服务器中
2.代码实现
<1>创建maven工程
I.创建一个普通的maven项目作为父工程(直接构建,不使用模块构建)
II.导入servlet、jsp的依赖
III.创建web项目(模块搭建maven)作为子工程
IV.修改web.xml为最新版本的,将maven的结构搭建完整
<2>.编写一个servlet程序
I. 编写一个普通类,实现servlet接口(直接继承HTTPServlet)
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//响应流
write.print("hello");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp)
}
}
II. web.xml中注册servlet并编写servlet映射
为什么需要映射:编写好的类是java程序,而浏览器访问需要连接web服务器,所以需要在web服务中注册我们写的servlet,还需要给浏览器一个能够访问的路径
<!--注册一个servlet-->
<servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>com.itcast.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/itcast</url-pattern>
</servlet-mapping>
III. 配置tomcat
注意配置项目的发布路径
IV. 启动测试
http://localhost:8080/alex
四.servlet原理
servlet是由web服务器调用的,web服务器收到浏览器的请求后。。。
1.servlt有两个默认的实现类:
sun公司为servlet接口提供了两个默认的实现类
HTTPServlet
GenericServlet
<1>.继承关系:
HTTPServlet extend GenericServlet
GenericServlet extend servlet
<2>.结构图:
<3>.重写doGet和doPost方法的分析
I.顶层接口servlet
II.GenericServlet
III.HTTPServlet
2.原理流程
<1>.浏览器向web容器(tomcat)发起请求
第一次访问发送的请求,会生成target的class文件并生成编写的servlet
<2>.tomcat产生两个对象请求request和响应response
<3>.请求和响应对象会调用servlet中的service方法处理请求和响应
<4>.自己重写的两个实现类是真正处理请求和响应的
<5>.web容器(tomcat)读取响应内容
<6>.tomcat将响应内容返回给客户端(浏览器)
3.原理流程图解
五.servlet中web.xml的mapping
1.配置解析
<1>.xml中注册一个servlet
<!--注册一个servlet-->
<servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>com.itcast.servlet.HelloServlet</servlet-class>
</servlet>
<2>映射路径
I一个servlet指定一个映射路径
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/itcast</url-pattern>
</servlet-mapping>
II.一个servlet指定多个映射路径
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/itcast</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/itheima</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/it</url-pattern>
</servlet-mapping>
III.一个servlet指定通用映射路径
<!--默认请求路径-->
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/itcast/*</url-pattern>
</servlet-mapping>
IV.默认请求路径(不要用)
<!--下面/*这个路径映射会导致请求不进首页面index,优先级较高-->
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
V.自定义后缀和前缀请求映射
<!--默认请求路径-->
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>*.itcast</url-pattern>
</servlet-mapping>
<3>mapping映射的优先级问题
2.应用场景
<1>404页面
I.servlet编写
II.xml中注册servlet并编写mapper映射路径
六.servlet3.0
注解开发,简化web.xml配置servlet的复杂性
1.编写servlet并继承httpservlet
2.使用注解代替xml配置
// @WebServlet(name = "QuickServlet",urlPatterns = "/quickServlet")
// @WebServlet(urlPatterns = "/quickServlet")
// @WebServlet(value = "/quickServlet")
@WebServlet("/quickServlet") // 注解中有且仅有一个属性,名为value时,属性名可以省略...
public class QuickServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("QuickServlet....3.0");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
3.配置tomcat并测试
七.ServletContext对象
1.是什么:
web容器(tomcat)在启动的时候,会为每个web程序都创建一个ServletContext对象,它代表了当前的web应用;servlet之间想要实现通信,需要经过一个中间商,如果用io方式比较麻烦,因此servletcontext就可以作为中间商(数据存到ServletContext中,所有的servlet就可以从这里拿到保存的数据),就可以实现会话共享
2.用来干什么:
<1>共享数据:(被session代替)
我在这个servlet中保存的数据,可以在另一个servlet中拿到;
I.编写servlet用于存取数据
II.编写mapping映射
<2>获取初始化参数
参考<1>共享数据的servlet
<3>请求转发(url不发生变化)(被request代替)
<4>读取资源文件(项目中会大量应用)(被类加载,反射代替)
注意:maven项目下,main目录下的java和resources统称为类路径classpath,properties文件不论是放在java或者resources下,都会被打包生成在target的classes下,如果放在java中没有导出,用maven中资源无法导出的解决方法
I.查看properties类常用方法
II.编写properties文件并查看class路径
III.编写servlet
IV.编写mapping映射
V.测试
八.HttpServletResponse 对象
1.是什么
HttpServletResponse extend ServletResponse
web服务器接受客户端的http请求,针对这个请求,分别创建一个代表请求和响应的HttpServletResponse和HttpServletRequest对象;
如果要获取客户端请求过来的参数,找HttpServletRequest,如果要给客户端响应一些信息,用HttpServletResponse
2.为什么用
学习servlet,主要就是学习请求和响应两个对象
3.怎么用
<1>常用方法简单分类:
I. 负责向浏览器发送数据
II . 负责向浏览器发送响应头的方法
III. 设置响应的状态码
<2>常见应用(下面几个应用都在response目录下)
I . 向浏览器输出消息
II . 下载文件
这个需求在java基础中,前3步用字符串,后几步用io流,下面是javaweb中的实现
i.servlet编写
①获取下载文件的路径与文件名
②设置让浏览器支持我们要下载的东西
③获取下载文件输入流
④创建缓冲区
⑤获取OutpUTStream对象
⑥将FileOutputStream流写入buffer缓冲区
⑦使用OutpUTStream将缓冲区的数据输出到客户端
ii.servlet注册并编写mapping映射路径
iii.部署tomcat
iv.测试下载文件
III. 验证码实现
i.前后端分离使用不同的技术:
前端可以用js等技术
后端用到java图片类,生成一个图片
ii.下面是用后端技术实现
①servlet编写
②注册servlet并编写mapping映射路径
IV . 实现重定向(url变化)(重点)
i.原理
一个servlet要找另一个servlet,先要告诉中间商,然后中间商告诉servlet去哪里找另一个servlet,这个过程url发生变化
ii.场景
①用户登录,登录成功就会跳转到另外一个页面
1>.编写servlet
2>.注册servlet并编写mapping映射路径
3>.测试访问
②重定向使用的登录Demo练习
1>.主页面与访问成功页面编写
2>.编写servlet
3>.部署tomcat并测试访问
九.HttpServletRequest对象
1.是什么:
代表客户端的一个请求,用户通过http协议访问服务器,http请求中的所有信息会被封装到HttpServletRequest对象中,通过这个对象中的方法,可以获取客户端的所有信息
2,怎么用:
<1>常用方法
<2>常见应用
I.获取前端传递的参数
II.请求转发(登录Demo练习)
i.主页面与登录成功页面编写