javaWeb中 servlet 、request 、response
1.Servlet
(1)Servlet是JavaEE的一个动态web资源开发技 术,就是在服务器上运行的小程序,这个小程序是由服务器调用的,服务器为了能调用这个小程序,就要求这样的程序必须实现一个Servlet接口或去继承 Servlet的实现类GenericServlet或HttpServlet、
(2)在web应用的配置文件web.xml中配置Servlet的对外访问路径,再将整个web应用交给虚拟机管理。
(3)Servlet的调用过程:
①服务器根据请求的包的host找到要访问的虚拟主机
②在请求包中需求的web应用资源找到对应的web应用,根据请求资源去查询web.xml 中的 url-pattern 找到对应的Servlet名字,再根据这个名字找到对应的Servlet-Class
③服务器调用这个Servlet-Class传递reqeust和response到该类中运行
④Servlet类将处理好的信息用response写入缓存中,再给服务器返回,最后交给浏览器
(4)Servlet的生命周期:从第一次被调用开始就由服务器创建出来,在创建出来后立即调用init方法初始化,直到web应用被虚拟主机移除或者服务器停掉,Servlet才会被销毁,
(5)Servlet的继承结构:
Servlet接口:所有Servlet必须实现的接口
|
——GenericServlet:对Servlet接口的一个默认实现,其中包含的service方法为一个抽象方法,并且提供一些常用方法。
|
——HttpServlet:专门增加了对HTTP请求的处理机制,实现了GenericServlet中的service方法,在此方法中会判断请求是以什么请求方式发送的,根据不同的请求方式会去调用响应的doXXX()方法,我们只需要继承HttpServlet,覆写其中的doGet()和doPost()方法就可以处理相应的Get和Post请求了了。
(6)web.xml中配置Servlet
<web-app>
//注册一个Servlet
<servlet>
//配置Servlet的名字
<servlet-name>AnyName</servlet-name>
//配置Servlet的对应类,注意,这里要的是一个类的全路径名,不要写成斜杠分割,也不要带.java或.class后缀名
<servlet-class>HelloServlet</servlet-class>
</servlet>
//映射Servlet的对外访问路径
<servlet-mapping>
//配置映射的Servlet名
<servlet-name>AnyName</servlet-name>
//配置虚拟访问路径
<url-pattern>/demo/hello.html</url-pattern>
</servlet-mapping>
</web-app>
(7)web.xml额外功能标签
①<load-on-startup>用在<servlet>标签中,来表示服务器启动时就创建该类的实例,其中可以设置一个正整形值,表示启动的顺序
②一个servlet的对外访问路径被配置为/,则该Servlet就是一个缺省Servlet,其他Servlet不处理的事情就由缺省Servlet来处理。
③<init-param>元素,其中可以配置一些初始化信息,在Servlet里可以通过ServletConfig获得
(8)线程安全问题
①类变量导致线程安全问题或者多个线程同时操作Servlet一会引起线程安全问题。
②解决办法,使用同步代码块嵌套可能造成线程安全问题的代码,不过会造成访问延迟和效率低下,避免使用类变量和减少线程阻塞时间和保证同步代码块代码尽量少。
(9)Context域对象
①ServletContext代表整个应用,在整个web应用都能够被看见,利用ServletContext域可以在不同的Servlet之间传递信息。
<context-param>
<param-name>contextData1</param-name>
<param-value>zzzzzz</param-value>
</context-param>
②利用ServletContext获取资源:
this.getServletContext().getResourceAsStream("虚拟路径");
this.getSerlvetContext().getRealPath("虚拟路径");//返回资源的真实路径
③利用类加载器去获取资源
loader.getResource("虚拟路径在classes路径算起").getPath();
//获取资源的真实路径再创建流
2、response
(1)向浏览器输出一段数据
//输出中文 没有乱码问题 底层是OutputStream输出
PrintWriter print = new PrintWriter(response.getOutputStream(),true);
print.println("happy!!!!!!!你们别玩了");
//设置响应头的编码形式可以防止乱码
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("你们别玩了")
(2)实现文件下载
//用URL编码防止中文乱码
String path = URLEncoder.encode("成人脑力训练.zip", "utf-8");
//设置消息头以附件的形式发布
response.setHeader("Content-Disposition", "attachment;filename="+path);
//用Context 流读取对应要下载的文件
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/成人脑力训练.zip");
//关联输出流输出文件
OutputStream out = response.getOutputStream();
int len = 0;
byte[] arr = new byte[1024];
while ((len = in.read(arr)) != -1) {
out.write(arr, 0, len);
}
in.close();
(3)设置响应头refresh可以实现页面的定时刷新功能
//html下 用<meta http-equiv= "" content="">可以模拟头功能
//定时跳转,登陆成功跳转就用的这个功能
//response.setHeader("Refresh", "3;url=/web/HelloWorld");
(4)控制是否缓存资源
//不缓存0或-1,用的是格林威治时间,用毫秒数表示
response.setDateHeader("Expires", 0);
(5)实现请求重定向
//重定向,代替了设置响应头的Location和设置状态302
//response.sendRedirect("/web/HelloWorld");
(6)验证码的制作
//设置不缓存
response.setDateHeader("Expires", 0);
//设置验证码的宽和高
int width = 150, height = width / 3;
//获取一个画板并设置宽和高,以及显示的色泽通道
BufferedImage img = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
//获取画布
Graphics2D g = (Graphics2D) img.getGraphics();
//设置颜色画背景
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
//设置颜色画边框
g.setColor(Color.BLUE);
g.drawRect(0, 0, width - 1, height - 1);
//设置常见汉字字符的样本
String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";
//设置颜色并画干扰线
g.setColor(Color.BLACK);
for (int x = 0; x < 10; x++) {
g.drawLine(getNum(0, width), getNum(0, height), getNum(0, width),
getNum(0, height));
}
//设置字体格式并把字体写入画布
g.setFont(new Font("微软雅黑", Font.BOLD, 20)); for(int x=0; x<4; x++) { //获取弧度 ,弧度=角度*PI/180 double d = getNum(-30, 30)*Math.PI/180; //旋转一定弧度并把字体写在相应的坐标 g.rotate(d, 20+x*30, 30); g.drawString(base.charAt(getNum(0, base.length()-1))+"", 20+x*30, 30); g.rotate(-d, 20+x*30, 30); } //以jpg格式输出到浏览器中 ImageIO.write(img, "jpg", response.getOutputStream());
(7)字节流和字符流是互斥的
3、request
(1)获取request中的各种信息
OutputStream out = response.getOutputStream();
response.setContentType("text/html;charset=gb2312");
//获取请求头的请求资源地址 主机地址 和端口
StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();
String addr = request.getRemoteAddr();
String host = request.getRemoteHost();
int port = request.getRemotePort();
String user = request.getRemoteUser();
out.write((uri+"-->"+url+"-->"+addr+"-->"+host+":"+port+"-->"+user).getBytes());
//获取请求头的方法,长度,类型,和编码形式
String method = request.getMethod();
int len = request.getContentLength();
String type = request.getContentType();
String path = request.getContextPath();
String encoding = request.getCharacterEncoding();
out.write("<hr/>".getBytes());
out.write((method+"-->"+len+"-->"+type+"-->"+path+":"+encoding).getBytes());
//获取请求头的名字和值
Enumeration<String> e = request.getHeaderNames();
while((e.hasMoreElements())) { String name = e.nextElement(); String value = request.getHeader(name); out.write("<hr/>".getBytes()); out.write((name+":"+value).getBytes()); }
(2)referer防盗链
//获取来路的值
String referer = request.getHeader("Referer");
//拿来路匹配前面的域名。如果匹配就转发,不匹配就重定向到本域名的首页
if(referer==null || !referer.startsWith("http://localhost"))
{
response.sendRedirect("/web/index.jsp");
}
else
request.getRequestDispatcher("/WEB-INF/miji.html").forward(request, response);
(3)处理中文乱码
//解决乱码,通用的方法。
String name = request.getParameter("name");
name = new String(name.getBytes("ISO8859-1"),"utf-8");
//解决乱码,post的特有方法。
request.setCharacterEncoding("utf-8");
(4)request域对象和转发
//将参数带去其他的servlet,但是流要注意用。不能使用2种流
request.setAttribute("test", "wow!!");
request.getRequestDispatcher("/f").forward(request, response);
(5)include
//上面的直接转发会导致流被清空然后输出不了数据,
//使用include可以输出本面页的信息以及要转发的面页信息,可以用组装面页
request.getRequestDispatcher("/f").include(request, response);
(6)重定向和转发的区别
①重定向:会改变浏览器的地址,2次请求和响应
②转发:不会改变浏览器的地址,一次请求和响应
(7)缓存区的研究
OutputStream out = response.getOutputStream();
byte[] arr = new byte[8192];
//缓存区满了会出现 chunked块发送
//满了后会以16进制数字标识块数据的大小,以0加空内容结束
out.write(arr);
int size = response.getBufferSize();
out.write(("<hr/>缓冲区满了吗?"+response.isCommitted()+"->缓存区大小:"+size).getBytes());
javaWeb中 servlet 、request 、response的更多相关文章
- JavaWeb中servlet读取配置文件的方式
我们在JavaWeb中常常要涉及到一些文件的操作,比如读取配置文件,下载图片等等操作.那我们能不能采用我们以前在Java工程中读取文件的方式呢?废话不多说我们来看看下我们以前在Java工程中读取文件是 ...
- 关于JavaWeb中Servlet的总结
Servlet知识结构图 Servlet是JavaWeb服务器端的程序,一般一个Servlet处理一种特定的请求.Servlet编写好后,需要指定其所处理的请求的请求路径,也可以认为Servlet是一 ...
- javaWeb中servlet开发(1)——helloworld
1.servlet 1.1 servlet简介 1.2 servlet流程 不管是servlet还是jsp,所有的程序都是在服务器端处理的,所以必须了解一个servlet基本流程 servlet和JS ...
- javaWeb中servlet开发——过滤器
servlet开发--过滤器(filter) servlet有三种,分为简单servlet.过滤器servlet.监听servlet 简单servlet是作为一种程序所必须的开发结构保存的,继承htt ...
- JavaWeb中Servlet和JSP的分工案例
jsp和Servlet的分工: * JSP: > 作为请求发起页面,例如显示表单.超链接. > 作为请求结束页面,例如显示数据. * Servlet: &g ...
- 在Struts2的Action中获得request response session几种方法
转载自~ 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象呢?Struts2为我们提供了四种方式.分别为se ...
- python-django_rest_framework中的request/Response
rest_framework中的request是被rest_framework再次封装过的,并在原request上添加了许多别的属性: (原Django中的request可用request._requ ...
- 使用 Masstransit中的 Request/Response 与 Courier 功能实现最终一致性
简介 目前的.net 生态中,最终一致性组件的选择一直是一个问题.本地事务表(cap)需要在每个服务的数据库中插入消息表,而且做不了此类事务 比如:创建订单需要 余额满足+库存满足,库存和余额处于两个 ...
- javaWeb中servlet开发(4)——servlet跳转
servlet跳转 1.跳转类型 客户端跳转:跳转后地址栏改变,无法传递request范围内属性,是在所有的操作都执行完毕之后才发生跳转的操作,跳转语法是,response.sendRedict() ...
随机推荐
- 常用快捷键(WebStorm, Eclipse, Sublime)
WebStorm 常用快捷键 Ctrl + / 单行注释// Ctrl + Shift + / 块注释/*…*/ Ctrl + D 复制行 Ctrl + Y 删除行 Ctrl + X 剪切(删除)行, ...
- Centos7下用命令同步标准时间
新装的CentO7S系统服务器可能设置了错误的时间,需要调整时区和时间.如下是CentOS7系统使用NTP协议,从一个时间服务器同步标准时间: [root@localhost ~]# cp /usr/ ...
- Android存储
Android的四种数据存储方式: 1.SharedPrefrences 2.SQLite 3.Content Provider 4.File SharedPrefrences: 1.是一种轻型的数据 ...
- POJ 3070 Fibonacci
Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. F ...
- bzoj3223 文艺平衡树
传送门 :http://www.lydsy.com/JudgeOnline/problem.php?id=3223 splay区间翻转的基础题,然而我还是调了一晚上(蒟蒻的悲哀) #include & ...
- Flags-Ural1225简单递推
Time limit: 1.0 second Memory limit: 64 MB On the Day of the Flag of Russia a shop-owner decided to ...
- HTMl链接- target/ name
下面解释一下链接标签的另外两个属性:target和name HTML 链接 - target 属性 使用 Target 属性,你可以定义被链接的文档在何处显示. 下面的这行会在新窗口打开文档: < ...
- wcscpy_s与wcsncpy
今天运行以下代码时一直出错 void Foo(const wchar_t* lpch, int len) { ... wchar_t *str = ]; wcscpy_s(str, len, lpch ...
- AChecker + Selenium2对需要登录的页面进行自动化可访问性测试
前言:这段时间还算比较空闲,我准备把过去做过的有些形形色色,甚至有些奇怪的研究总结一下,也许刚好有人用的着也不一定,不枉为之抓耳挠腮的时光和浪费的电力. 名词解释: 网站可访问性测试:国内基本没有 ...
- [转]使用 Shell 对进程资源进行监控
原文:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-monitoring/ 使用 Shell 对进程资源进行监控 检查进程是否存在 在 对 ...