`
Junjiejkl
  • 浏览: 62375 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
阅读更多
代码部分:

演示Servlet线程安全问题及处理方案

package cn.itcast.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.SingleThreadModel;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo2 extends HttpServlet {
	private int counter;
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 以下代码需要保护
		synchronized (this) {
			counter++;
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(this.hashCode());
			System.out.println("你是第" + counter + "个访问者");
		}
	}
}



通过ServletConfig获得在web.xml文件中配置的数据库连接信息

package cn.itcast.web.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo3 extends HttpServlet {
	// private ServletConfig config;
	// 读取web.xml文件中的信息
	//public void init(ServletConfig config) throws ServletException {
	//	this.config = config;
	//}
	public void destroy() {
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		ServletConfig config = this.getServletConfig();
		String email = config.getInitParameter("email");
		String address = config.getInitParameter("address");
		String charset = config.getInitParameter("charset");
		if (email != null && address != null && charset!=null) {
			response.setContentType("text/html;charset="+charset);
			response.getWriter().write("邮箱:" + email);
			response.getWriter().write("地址:" + address);
		}
	}
}


同一web应用中多个Servlet通过ServletContext对象实现数据共享

package cn.itcast.web.servlet;
import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo41 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		//取得唯一的一个ServletContext对象,该对象在整个day06应用中唯一
		ServletContext context = this.getServletContext();
		System.out.println(context.hashCode());
		//将"小李"存到ServletContext对象中
		context.setAttribute("name","小李");
	}
}
package cn.itcast.web.servlet;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo42 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		//取得唯一的一个ServletContext对象,该对象在整个day06应用中唯一
		ServletContext context = this.getServletContext();
		System.out.println(context.hashCode());
		String name = (String) context.getAttribute("name");
		System.out.println("name=" + name);
	}
}


获取web应用的初始化参数

package cn.itcast.web.servlet;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo5 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		ServletContext context = this.getServletContext();
		String webName = context.getInitParameter("webName");
		String webDate = context.getInitParameter("webDate");
		System.out.println("webName=" + webName);
		System.out.println("webDate=" + webDate);
	}
}



实现Servlet的转发,模拟实现MVC设计模式

package cn.itcast.web.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo6 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		System.out.println("正在处理用户登录");
		User user = new User();
		boolean flag = user.check("jack","111");
		if(flag){
			//取得转发对象
			RequestDispatcher rd = request.getRequestDispatcher("/success.html");
			rd.forward(request,response);
		}else{
			RequestDispatcher rd = request.getRequestDispatcher("/fail.html");
			rd.forward(request,response);
		}
	}
}


利用ServletContext对象读资源文件(txt/properties/xml)

package cn.itcast.web.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo7 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		//InputStream is = Demo7.class.getClassLoader().getResourceAsStream("/config/config.properties");
		/*
		 *  通过context对象,加载文件
		 * 	ServletContext context = this.getServletContext();
		 *	InputStream is = context.getResourceAsStream("/config/config.properties");
		 */ 
		/*
		 *  传统方式启动,是基于tomcat/bin/目录下
		 *  
		 */
		InputStream is = new FileInputStream("D:\\apache-tomcat-6.0.29\\bin\\src\\config.properties");
		Properties prop = new Properties();
		prop.load(is);
		String email = prop.getProperty("email");
		String address = prop.getProperty("address");
		System.out.println(email+"#"+address);
	}
}

package cn.itcast.web.servlet;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo9 extends HttpServlet {
	protected long getLastModified(HttpServletRequest req) {
		System.out.println("getLastModified()");
		String path = this.getServletContext().getRealPath("/config/abc.txt");
		System.out.println("path=" + path);
		File file = new File(path); 
		return file.lastModified();
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		System.out.println("doGet()");
		InputStream is = this.getServletContext().getResourceAsStream("/config/abc.txt");
		OutputStream os = response.getOutputStream();//输出流对象指向浏览器
		byte[] buf = new byte[1024];
		int len=0;
		while( (len=is.read(buf))>0  ){
			os.write(buf,0,len);
		}
		is.close();
		os.close();
	}
}


通过类加载器加载src/config.properteis目录下的资源文件

/*InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("cn/itcast/web/servlet/config.properties");*/


设置静态资源缓存的时间

package cn.itcast.web.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo8 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		
		long curr = System.currentTimeMillis();
		//缓存7天时间
		response.setDateHeader("expires",curr+(7*24*60*60*1000));
		
		String data="[法律声明][联系我们][版权]";
		response.getWriter().write(data);
	}
}


缓存的高级应用:如果客户端的缓存跟服务器的资源时间一样,则在直接找自己的缓存
如果客户端的缓存相对服务器已经过时了,则找服务器要资源

package cn.itcast.web.servlet;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo9 extends HttpServlet {
	protected long getLastModified(HttpServletRequest req) {
		System.out.println("getLastModified()");
		String path = this.getServletContext().getRealPath("/config/abc.txt");
		System.out.println("path=" + path);
		File file = new File(path); 
		return file.lastModified();
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		System.out.println("doGet()");
		InputStream is = this.getServletContext().getResourceAsStream("/config/abc.txt");
		OutputStream os = response.getOutputStream();//输出流对象指向浏览器
		byte[] buf = new byte[1024];
		int len=0;
		while( (len=is.read(buf))>0  ){
			os.write(buf,0,len);
		}
		is.close();
		os.close();
	}
}


向浏览器输出中文数据,乱码的解决

package cn.itcast.web.response;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo1 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		//String data="中国";
		//让response查UTF-8码表
		//response.setCharacterEncoding("UTF-8");
		//让浏览器用UTF-8码表
		//response.setContentType("text/html;charset=UTF-8");
		//response.getWriter().write(data);
		
		//向浏览器输出数字100
		//response.getOutputStream().write((100+"").getBytes());
		
		//String data="中国";
		//response.setContentType("text/html;charset=GB2312");
		//response.getOutputStream().write(data.getBytes());
		
		String data = "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww";
		//response.getWriter().write(data);
		response.getOutputStream().write(data.getBytes());
	}
}


中文名文件下载

package cn.itcast.web.response;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo2 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		String path = this.getServletContext().getRealPath("/config/富人与穷人.JPG");
		File file = new File(path);
		
		
		//response.setCharacterEncoding(charset);[设置响应体]
		response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(file.getName(),"UTF-8"));//[设置响应头]
		
		InputStream is = new FileInputStream(file);
		OutputStream os = response.getOutputStream();
		byte[] buf = new byte[1024];
		int len=0;
		while( (len=is.read(buf))>0  ){
			os.write(buf,0,len);
		}
		is.close();
		os.close();
	}
}


生成验证码图片

package cn.itcast.web.response;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.UUID;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo3 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		
		//在内存中创建一副图片
		BufferedImage image = new BufferedImage(300,20,BufferedImage.TYPE_INT_RGB);
		//取得画笔
		Graphics g = image.getGraphics();
		g.setColor(Color.YELLOW);
		//将字符串"abc"画在特定位置上
		g.drawString(UUID.randomUUID().toString(),5,10);
		/* 以下代码将内存中的图片输出到浏览器
		 * 参数一:将image图片输出到浏览器
		 * 参数二:以什么类型输出
		 * 参数三:输出到什么地方 
		 */
		ImageIO.write(image,"jpg",response.getOutputStream());
		/*
		 * 控制浏览器不要缓存
		 */
		response.setHeader("expires","-1");
		response.setHeader("cache-control","no-cache");
		response.setHeader("pragma","no-cache");
	}
}



今日总结:

1 servlet细节

细节一:访问servlet需要使用<url-pattern>
细节二:访问servlet要么以/*或*.do,不能以/*.do访问,同时一个servlet可能映射为index.html
细节三:*.do扩展名优先级最低,以长得最像为优先
细节四:servlet程序由web服务器中servlet引擎调用,每次调用service/doGet/doPost方法,web服务器都会创建新的
        request和response对象
*细节五:使用<load-on-startup>标签
       <load-on-startup>1</load-on-startup>
       1 在将web应用部署到web服务器时,执行init()方法
         如果没有该设置,表示在浏览器第一次访问时执行init()方法
       2 指定servlet初始化的顺序,数字小先执行
       3 对于负数和不写<load-on-startup/>一样
       4 对于0来说,0先执行,如果都为0,按照在web.xml文件中书写的位置决定先后调用
细节六:缺省servlet的映射路径为/,访问所有的资源都是通过servlet来访问,web服务器有缺省servlet
*细节七:servlet线程安全
       解决方案:
       1 实现SingleThreadModel接口(标志性接口),如果某个线程未执行完doGet()方法,web服务器会创建新的servlet为
         其他线程服务,因此同一个servlet可能在web服务器中有多个实例,项目中不提倡使用
       2 对代码加锁
 
2 config对象
  读取web.xml文件的配置信息

*3 context对象
  1 在同一个web应用中共享信息
    context对象的创建和销毁由web服务器负责
    当将web应用部署到web服务器时,web服务器创建context对象,
    当将web应用从web服务器移除时,web服务器销毁context对象。
  2 取得web初始化参数
  3 什么是MVC结构?如何实现servlet转发
    RequestDispatcher rd = request.getRequestDispatcher("/需要转发的目标资源");
    rd.forward(request,response);
  4 传统方式加载文件,是基于tomcat/bin/目录下
  5 通过context对象读取文件:
    1 ServletContext context = this.getServletContext();
      InputStream is = context.getResourceAsStream("/WEB-INF/classes/config.properties");
      /WEB-INF/classes/config.properties:表示部署到web服务器中的目录结构
    2 通过类加载器对象读取文件:
      InputStream is = Demo7.class.getClassLoader().getResourceAsStream             ("cn/itcast/web/servlet/config.properties");
      只能加载/WEB-INF/classes/目录下的资源
     

*4 缓存的应用
  a)对于静态数据(图片,文字,视频,音频)等不常更新的内容,可以设定一个可理的缓存时间
response.setDateHeader("expires", (curr + 7*24*60*60*1000) );

  b)对于动态数据或静态数据经过更新后,如果服务器数据较新,则客户端请求服务器,如果客户端和服务端数据一至,则
    客户端找缓存

*5 response对象的应用
  a)中文的输出(字符,字节)
    对于中文数据,优先使用字符输出[PrintWriter]
    对于英文数所,二种兼可
  b)对于中文文件名的下载需要编码
    URLEncoder.encode(file.getName(),"UTF-8")
  c)检证码图片

       


加载文件和路径的问题:
0 传统方式[相对JVM的启动目录]
  InputStream is = new FileInputStream("config.properties");[tomcat/bin/]


1 ServletContext对象加载
  a)文件可以位于整个web应用的任意路径下
  b)文件并没有整个加载到内存中[jvm],只是提供一个引用/指针
  c)文件内容大小无限制
  d)/表示当前web应用名,即day06


2 类加载器加载
  a)文件只有放在/WEB-INF/classes/目录下,即开发工具的src/目录下
  b)文件一次性整个加载一内存[jvm]
  c)文件内容大小有限制,理论上小于jvm启动大小
  d)/表示当前web应用名,即day06
 

3 写路径的技巧
  客户端:html     <a href="http://localhost:8080/day06/Demo">下载</a>
                   <from action="/day06/Demo"/>
  /表示:webapps目录
  http://localhost:8080/day06/Demo网络定位的绝对路径

  c:\a\b\c.txt(硬盘的绝对路径)
 


  服务端:servlet  InputStream is = context.getResourceAsStream("/config/config.properties");
/表示:当前web应用名,即day06









  • 大小: 34.1 KB
  • 大小: 37.1 KB
  • 大小: 41.1 KB
分享到:
评论

相关推荐

    day06_markdown_python教程_

    在本教程中,我们将深入探讨"day06_markdown_python教程_"的主题,这是针对零基础学员的Python学习系列的一部分。这个教程重点介绍了如何在Python编程环境中利用Markdown这一轻量级标记语言来增强代码的可读性和文档...

    31天iOS入门源码

    Day 06: Reaction Time Day 07: Speed Dialer Day 08: Flickr KML Day 09: Snow Fall Day 10: Where am I? Day 11: Plumb-Bob Day 12: U Decide Day 13: MyGoogle Day 14: Sleep Sound Day 15: ZipWeather Day 16: ...

    Check my trip

    **标题:“Check my trip”** **描述:** 这是一篇关于旅游开发的文章,旨在为用户提供一个详细的行程单示例。 **标签:** "travel" **部分具体内容概述:** 该文档提供了名为Dong Li的旅客的具体行程安排及相关...

    2021-2022年收藏的精品资料高考英语单句语法填空—定语从句专项练习.doc

    6. **定语从句在实际语境中的应用**:例如"I am looking forward to the day _when_ my daughter can read this book and know my feelings for her." 这里的"when"引导定语从句,修饰"the day",表明期待的具体时刻...

    [Photoshop] Photoshop CS5 实战手册 (英文版)

    It covers Photoshop from a practical standpoint, with tips, tricks, and practical advice you can use every day to edit photos and create beautiful documents. Whether you're a beginner or an ...

    MySQL启动报错问题InnoDB:Unable to lock/ibdata1 error

    【MySQL启动报错问题InnoDB:Unable to lock/ibdata1 error】是一个常见的MySQL服务器启动时遇到的问题。这个问题通常表明MySQL的InnoDB存储引擎无法获取对`ibdata1`文件的锁,`ibdata1`是InnoDB用来存储数据和系统表...

    Oracle Date常用方法封装

    my_birthday DATE := TO_DATE('1985-06-25', 'YYYY-MM-DD'); BEGIN DBMS_OUTPUT.PUT_LINE('Next birthday: ' || ADD_MONTHS(my_birthday, 12)); -- 下一年生日 DBMS_OUTPUT.PUT_LINE('Last day of this month: ' ...

    linux下动态库的建立和使用

    /* datetime.h : 纵横软件制作中心雨亦奇编写, 2001-06-28. */ #ifndef __DATETIME_H #define __DATETIME_H /* 日期结构 */ typedef struct { int year; int mon; int day; }DATETYPE; /* 时间结构 */ typedef ...

    在Django框架中伪造捕捉到的URLconf值的方法

    url(r'^mydata/birthday/$', views.my_view, {'month': 'jan', 'day': '06'}), url(r'^mydata/(?P&lt;month&gt;\w{3})/(?P&lt;day&gt;\d\d)/$', views.my_view), ] ``` 2. **视图函数**:由于我们没有修改视图函数本身,...

    Hive开发规范及要点

    2. 使用Hive命令行模式导出数据:使用`hive -e "select day_id,user,count from user_table where day_id in ('2014-03-06','2014-03-07','2014-03-08','2014-03-09','2014-03-10');"&gt; /home/test/test.dat;`语句...

    Get.Smart.Season 1.srt

    Get.Smart.1965.s01e08.The.Day.Smart.Turned.Chicken.avi [175.32 Mb] Get.Smart.1965.s01e09.Satan.Place.avi [175.41 Mb] Get.Smart.1965.s01e10.Our.Man.in.Leotards.avi [175.35 Mb] Get.Smart.1965.s01...

    用Python下载ERA5数据超详细教程

    在安装时建议勾选“Add Anaconda to my PATH environment”以便于在命令行中直接使用Anaconda工具。 3. **验证安装**: - 打开Anaconda Prompt,输入`python`,如果能够正常启动Python解释器,则表示安装成功。 -...

    SQL 判断给定日期值(或时间段)所在星期的星期一和星期天的日期

    测试`MY_Range_GetWeekFirstAndEndDays`函数,使用日期`2011-09-01`至`2011-10-06`,会返回这段时间内每个星期的开始和结束日期。 这两个函数对于处理与星期相关的报告和分析非常有用,比如周销售报告或者按周跟踪...

    Spring MVC之@RequestMapping注解详解

    在这个例子中,`{day}`是一个变量,实际请求如`/appointments/2022-06-07`将被映射到这个方法。 2. **method**:用于指定请求的HTTP方法,如GET、POST、PUT、DELETE等。默认情况下,如果不指定,将处理所有HTTP...

    system mechanic Activator v1.0

    the welcome screen, press "start 30-day evaluation period" . * Keys generated by keymaker are not official, they will work only side by side with this tool. * To register offline, check "Subscribe...

    JGsoft.PowerGREP.v4.1.0.Retail-ZWT 压缩包一.共两个压缩包

    RELEASE DATE : 2010-06-08 ? PACKER : TEAM Z.W.T 嘲媚哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪呐哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪宁 嘲?LANGUAGE : ENGLiSH ? SiZE : 03 x 5.00MB 嘲媚哪哪哪哪哪哪哪哪哪哪...

    JGsoft.PowerGREP.v4.1.0.Retail-ZWT 压缩包二.共两个压缩包

    RELEASE DATE : 2010-06-08 ? PACKER : TEAM Z.W.T 嘲媚哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪呐哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪宁 嘲?LANGUAGE : ENGLiSH ? SiZE : 03 x 5.00MB 嘲媚哪哪哪哪哪哪哪哪哪哪...

    新思微POS连锁超市管理系统(delphi源码控件)

    新思微POS连锁超市管理系统(delphi源码控件)(这次上传的是控件,方便大家学习与二次开发,请大家支持正版)POS收银系统.超市进销存管理系统.网络版.MSSQL2000★Delphi源码 │ ├─超市收银系统pos(无敌打印)for...

Global site tag (gtag.js) - Google Analytics