二:Servlet
一:servlet开端
1.servlet是什么?
a.就是一个java类
b.服务器端的小程序
c.处理用户请求
2.servlet的实现:
a.实现Servlet接口
b.继承GenericServlet类
c.继承HttpServlet类
3.编写Servlet:
a.新建web项目
b.编写Servlet实现类
c.在web.xml中部署Servlet
d.发布项目,访问
http://localhost:8080/helloservlet/hello
二:helloServlet详细
1.servlet的执行流程
Tomcat结构:
Web服务器
web.xml
Container
Servlet类
请求流程图:
浏览器 Web服务器 Servlet类
描述:用户发起一个请求后,由服务器接受处理,根据web.xml文件中的配置信息,
查找所请求的资源(访问路径)是否存在,如果不存在则返回错误(404);当找到
资源后(servlet),检查该Servlet对象是否存在,如果不存在则创建该对象,如果
存在则执行相应的处理方法.处理方法执行以后将返回处理结果给web服务器,web
服务器根据结果进行相关处理后,返回给浏览器,浏览器显示相应的处理结果.
2.servlet生命周期
实例化(无参数的构造方法)
初始化init()
service()服务 --> 可以多次调用
destory()销毁
servlet类的实例化时机:
a.配置容器启动时调用(容器启动时就会实例化);
<load-on-startup>0</load-on-startup>
b.当请求时,该servlet对象不存在(超时期之后)
3.servlet配置详解
每写一个selvlet类,就需要配置一个servlet
每个servlet都有三个名字:类名,servlet-name,访问名
servlet-name:唯一(与类名相似)
访问名:访问路径(可以有多个)
三:HttpServletResponse对象
1.HttpServletResponse对象的产生:
当服务器接受到请求后会产生两个对象:请求对象和响应对象,并且将这两个对象给Servlet
2.响应数据:
getOutputStream():字节流数据
getWriter():字符流数据
getOutputStream和getWriter互斥,不共戴天
原因:当调用getOutputStream或getWriter后,服务器接收后会将数据进行处理.处理完成后
会检查流对象是否关闭,如果没有关闭,服务器会自动关闭
3.ServlerResponse对象的设置内容编码方法
setContentType("text/html;charset=utf-8");
指定响应内容的编码格式(浏览器的编码)
4.响应html文档
分析一个书籍管理系统:
book{
ID,
Name,
Price,
Author,
pubDate
}
建表:
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`price` double(10,2) DEFAULT NULL,
`author` varchar(50) DEFAULT NULL,
`pubDate` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在项目中新建实体类book,放于cn.lkzlg.entity
分析功能,先做显示所有书籍
先做数据查询功能--
由于对数据的操作有很多,如增加,修改,查询,删除等于数据库交互的操作,
所以将这些操作放于一个类中,取名:BookDao(data access object 数据访问对象)
建一个dao包:该包下存放所有与数据库相关的操作
编写BaseDao类
编写BookDao类
编写ListServlet类
四:HttpServletRequest对象
1.HttpServletRequest 请求对象. 从客户端发送请求,服务将会创建该对象
2.有哪些请求?
a.在浏览器地址栏,直接输入url地址
b.超链接<a href="url"></a>
c.js中:location.href="url";
d.Form表单的提交
注: 如果使用get提交,那么所提交的参数是追加到url后面;
以?name=value&key=value&key=value这样的方式追加
a,b,c都是get方式,d如果method="get"也是get提交
如果使用post提价,那么数据将会被封装到form data;
Get和Post的区别:
get:长度有限,安全性较差,效率相对于post高
post:长度没有限制,安全性较get好,效率相对于get差 (文件上传)
3.新建add.html
4.编写AddServlet类
5.书籍管理系统修改分析
1).在查询所有书籍列表时,点击修改链接,进行修改
2).跳转到修改书籍页面
以上操作须有两个步骤来完成:
a.点击 修改 进行查询的Servlet.在查询的Servlet中,要根据被点击的书籍
的id去数据库中查询该id所对应的书籍记录.
分析查询Servlet:
由于查询Servlet需要id去查询指定的书籍记录,那么要将id传给查询Servlet
将数据提交到Servlet中有两种方式:post和get; post方式需要表单,get方式可以指定超链接
若是post方式:
<form action="selectById" method="post">
<input type="hidden" value="2" name="id"/>
<input type="submit" value="修改"/>
</form>
若是get方式:
将form中的method设为get
<a href="selectById?id=2">修改</a>
b.将查询结果展示浏览器:
在编辑修改页面时,需要将书籍对象的值设入表单域中
注意:需要将id以隐藏域的方式进行设置,因为在修改数据时,需要根据id来修改
五:重定向与转发
1.重定向:由resp.sendRedirect("url");实现。
2.当使用重定向时,服务器会将重定向的地址("list")交给浏览器.浏览器
根据新的url,重新发起一个新的请求
六:request获取其它表单数据(例:register.html和RegServlet类)
html表单编写
AddServlet类获取数据的处理
七:request中的其它方法(例:HelloServlet类)
req.getHeader("Host");
req.getHeaderNames();
req.getContextPath();
req.getRequestURI();
req.getRequestURL();
req.getRemoteAddr();
req.getRemoteHost();
八:乱码的解决
提交数据:
post提交 设置:req.setCharacterEncoding("utf-8");
get提交:
a.需要转换:
String name = req.getParameter("name");
name = new String(name.getBytes("iso-8859-1"),"utf-8");
b.还可以设置tomcat:
conf-->server.xml-->在端口号port=8080的Connector标签里加上
URIEncoding="utf-8"
响应数据:
设置的在网络传递编码,默认为iso-8859-1
resp.setCharacterEncoding("utf-8");
设置浏览的编码
resp.setContentType("text/html;charset=utf-8");
解决不同浏览器编码不一致的问题,设置useBodyEncodingForURI的值
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"
useBodyEncodingForURI="true"/>
//--------------------------------------------------------------
ServletContext对象学习:
问题:
不同的用户使用相同的数据
解决:
ServletContext对象
特点:
服务器创建
用户共享
作用域:
整个项目内
生命周期:
服务器启动到服务器关闭
使用:
获取ServletContext对象
//第一种方式:
ServletContext sc=this.getServletContext();
//第二种方式:
ServletContext sc2=this.getServletConfig().getServletContext();
//第三种方式:
ServletContext sc3=req.getSession().getServletContext();
使用ServletContext对象完成数据共享
//数据存储
sc.setAttribute(String name, Object value);
//数据获取
sc.getAttribute("str") 返回的是Object类型
注意:
不同的用户可以给ServletContext对象进行数据的存取。
获取的数据不存在返回null。
获取项目中web.xml文件中的全局配置数据
sc.getInitParameter(String name); 根据键的名字返回web.xml中配置的全局数据的值,返回String类型。
如果数据不存在返回null。
sc.getInitParameterNames();返回键名的枚举
配置方式:注意 一组<context-param>标签只能存储一组键值对数据,多组可以声明多个 <context-param>进行存储。
<context-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</context-param>
作用:将静态数据和代码进行解耦。
获取项目webroot下的资源的绝对路径。
String path=sc.getRealPath(String path);
获取的路径为项目根目录,path参数为项目根目录中的路径
获取webroot下的资源的流对象
InputStream is = sc.getResourceAsStream(String path);
注意:
此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取。
path参数为项目根目录中的路径
ServletConfig对象学习:
问题:
如何获取在web.xml中给每个servlet单独配置的数据呢?
解决:
使用ServletConfig对象
使用:
获取ServletConfig对象
获取web.xml中的配置数据
二:Servlet的更多相关文章
- 二SERVLET(2)
转载自http://www.cnblogs.com/xdp-gacl/p/3763559.html 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件 ...
- javaweb学习总结二十二(servlet开发中常见的问题汇总)
一:web应用的映射问题 通常我们从别人那里拷贝来的代码,自己会修改应用的名称,但是web映射的访问路径并没有修改,还是原来的映射. 解决方法: 工程右键--properties--myeclipse ...
- Java Web(二) Servlet中response、request乱码问题解决
三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, M ...
- java web(二): servlet的简单使用和介绍
前言:通过编写一个servlet类,向浏览器发送hello world来阐述servlet. 一:创建动态web项目 1. 首先切换到javaEE视图. 在ecplise左边即项目管理器哪里右键点击新 ...
- web开发(二) Servlet中response、request乱码问题解决
在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6412475.html>,在此仅供学习参考之用. 一.re ...
- 动手学servlet(二) servlet基础
1.我们来试着向一个servlet提交一个表单,现在webcontent下新建一个login.html页面,其中action对应servelt类名,代码如下: <!DOCTYPE HTML PU ...
- j2ee爬坑行之二 servlet
servlet生命周期 web容器加载servlet 类 web容器调用servlet的构造函数,初始化servlet. web容器调用servlet的init()方法.注意该方法在servlet的一 ...
- Java Web(二) Servlet详解
什么是Servlet? Servlet是运行在Web服务器中的Java程序.Servlet通常通过HTTP(超文本传输协议)接收和响应来自Web客户端的请求.Java Web应用程序中所有的请求-响应 ...
- Servlet和JSP读书笔记(二)
一. GenericServlet 1. 前面写的 Servlet和JSP学习笔记(一) 中的实例都是通过实现Servlet接口编写的,这样存在的问题就是:你必须实现Servlet中的所有方法,而不管 ...
- J2EE基础之Servlet
J2EE基础之Servlet 1. 什么是Servlet? Servlet即Java服务小程序,是使用应用程序设计接口以及相关类和方法的Java程序.它可以作为一种插件,像Applet程序一样嵌入到 ...
随机推荐
- C++一些函数的意义
1.重载 : C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载 2.隐藏和覆盖的区别 IF 子类的函数与父类的名称相同,但是参数不同 父类函数被隐藏(还存在) ELS ...
- FFMpeg音频重采样和视频格式转
一.视频像素和尺寸转换函数 1.sws_getContext : 像素格式上下文 --------------->多副图像(多路视频)进行转换同时显示 2.struct SwsContext ...
- nginx 场景业务汇总 (初)
本文链接:http://www.cnblogs.com/zhenghongxin/p/8891385.html 在下面的测试中,建议每次修改nginx配置文件后,都用此命令检查一下语法是否正确: [r ...
- AVL树的实现——c++
一.概念 AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的.它是最先发明的自平衡二叉查找树,也被称为高度平衡树.相比于"二叉查找树",它 ...
- mariadb审计日志通过 logstash导入 hive
我们使用的 mariadb, 用的这个审计工具 https://mariadb.com/kb/en/library/mariadb-audit-plugin/ 这个工具一点都不考虑后期对数据的处理, ...
- 《JAVA与模式》之合成模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...
- ios实现fastlane自动化打包
终于抽出时间来学习自动化打包了,app在测试阶段一天总会经历好几次的打包,每次打包真是身心疲惫,刚打完的包说不定就被测试妹子反应还要微调什么地方,我就真的有气没法出,打一次包怎么也得浪费十几分钟,还不 ...
- Seqlist L 与 Seqlist *L的区别
Seqlist L结构体变量,SeqlistInsert之后不可以带回新的插入数据. Seqlist *L 是传结构体指针 用SeqlistInsert之后可以有新的插入.
- 2018春招-今日头条笔试题-第三题(python)
题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 本题的做法最重要的应该是如何拼出‘1234567890’,对于输入表达试获得对应的结果利用python内置函数eval ...
- spring自定义注解拦截器的配置
1.创建注解文件 (文件格式为注解) 这里面什么都不需要写 文件名就是注解名称 如下 是@anno package com.ABC123.anno; import java.lang.annotati ...