myday06

代码部分:
[code]

演示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");
}
}[/code]


[size=large][color=red][b]今日总结:[/b][/color][/size]

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


[img]http://dl.iteye.com/upload/attachment/429371/d2159e01-e695-3de4-8766-00fc69c3d22a.jpg[/img]


[img]http://dl.iteye.com/upload/attachment/429373/430d655c-23e0-3ca6-9e0a-6e8093b708b6.jpg[/img]


[img]http://dl.iteye.com/upload/attachment/429375/42be68db-056a-3969-a461-cecf5c2f4a00.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值