servlet涉及对象

ServletConfig对象(封装servlet的配置信息)
1)在Servlet的配置文件中,可以使用一个或多个<init-param>(在servlet标签中配置)标签为Servlet配置一些初始化参数。当Servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
2)通过getServletConfig()方法得到对象即可

ServletContext对象
1)Web容器在启动时,它会为每个web应用程序创建一个对应的ServletContext对象,它代表当前web应用。ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时。可以通过ServletConfig.getServletContext方法获得ServletContext对象。通过this同样可以获得此对象。
2)由于一个web应用中的所有Servlet共享同一个ServletContext对象,所以多个Servlet通过ServletContext对象实现实现数据共享。ServletContext对象通常也被称之为context域对象。
3)Servlet应用程序范围。例如,实现不同servlet共享
4)使用context-param(在web-app标签下配置)可以配置整个web应用的初始化参数,通过getInitParameter方法获得
5)区分重定向与转发,重定向让客户端自己在发一次请求,即服务器接收了两次请求,转发是客户端帮忙找到目标,服务器接收了客户端一次请求
6)servlet转发,使用getRequestDispatcher方法
	RequestDispatcher rd = this.getServletContext().getRequestDispatcher("xx.jsp");
	rd.forward(request,response)
	(不过把数据带给jsp不能通过context域,应该使用request域,由于大家共享,很对人访问时,就会造成数据紊乱的问题)
7)服务器启动创建,删除web应用或者停止服务器销毁
8)配置文件,数据之间没有关系,一般用properties,有关系使用xml
9)ServletContext对象读取web应用中的配置文件
	方法一:
	InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/xxx.properties");
	//读取资源文件时注意路径,最好使用以上方式,若使用传统方式如FileInputStream,若使用相对路径是相对java虚拟机启动位置,即bin
	Properties props = new Properties();
	props.load(in);//存在了map集合中
	String value = props.getProperty("xxxx");
	方法二(获取绝对路径读):
	String path = this.getServletContext().getRealPath("/WEB-INF/classes/xxx.properties");
	//此种方法好处在于还可以获得资源名称
	FileInputStream in = new FileInputStream(path)
	//接下来同方法一
10)web应用中的普通资源如何读取资源文件
如果读取资源文件的不是servlet的话,就只能通过类装载器去读,当然可以同过传递ServletContext对象进行读取,但是会不符合分层设计思想
public class UserDao{
	public void update() {
		InputStream in = UserDao.class.getClassLoader().getResourceAsStream("相对该类加载器的位置的文件位置");
		//InputStream in = UserDao.class.getResourceAsStream("相对该类位置的文件位置");
		//通过类装载器读取配置文件注意不能太大,而且他像装载类一样,只装载一次
		//服务器没有停止,则改动配置文件后内存中的配置文件并没有影响
		//如果有读取更新后文件的需求,需要得到文件位置,改用传统方式来读,如下:
		//String path = UserDao.class.getClassLoader().getResource("").getPath();
		//FileInputStream in = new FileInputStream(path);
	}
}

Request和Response对象
web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象;request和response对象既然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了,要向客户机输出数据,只需要找response对象就行了。

Response对象
1)HttpServletResponse对象是服务器的响应,这个对象中封装了向客户端发送数据(如getWriter(),getOutputStream())、发送响应头(如setHeader()、addHeader())、发送响应码(如setStatus())的方法
2)OutputStream输出数据问题:
浏览器所用码表一般为gb2312(可修改),而我们一般做到通用一般使用utf-8来编码,所以可以使用response对象告诉浏览器如何解码(即程序以什么码表输出了,程序就要以什么码表打开):
	response.setHeader("Content-type","test/html;charset=UTF-8");
	String data = "中国";
	OutputStream out = response.getOutputstream();
	out.write(data.getBytes("UTF-8"));
	//html:<meta>标签可以模拟一个http响应头,如下所示:
	//String data = "中国";
	//OutputStream out = response.getOutputstream();
	//out.write("<meta http-equiv='content-type' content='text/html;charset=utf-8'>".getBytes());
	//out.write(data.getBytes("UTF-8");
	//注意:text/html;charset=utf-8中的分号写成逗号,浏览器会提示下载资源
3)Writer输出数据问题:
Writer输出数据时,response交给服务器再交给浏览器是使用的是iso-8859-1码表,所以需要指定response输出码表:
	//设置response使用的码表,以控制response以什么码表向浏览器写出数据
	response.setCharacterEncoding("UTF-8");
	//指定浏览器以什么码表打开服务器发送的数据
	response.setHeader("content-type","test/html;charset=utf-8");
	//response.setContentType("test/html;charset=utf-8");//等于以上两句代码
	String data = "中国";
	PrintWriter out = response.getWriter();
	out.writer(data);
4)文件下载和中文文件下载:
	String path = this.getServletContext().getRealPaht("/../1.jpg");
	String filename = path.substring(path.lastIndexOf("\\")+1);
	response.setHeader("content-disposition","attachment;filename="+filename);
	//文件名字是中文,文件名需要经过URL编码:URLEncoder.encode(filename,"utf-8")
	InputStream in = new FileInputStream(path);
	//...	
5)输出随机验证码图片,并做到点击更换:
见文件夹:验证码代码
	通过BufferImage在内存中创建图片
	通过Graphics在图片中画出图形
	通过ImageIO从内存中写出图片
	注册页面使用验证码图片时:<img src="servlet路径"/>(注意解决图片缓存问题)
6)控制浏览器定时刷新:
	response.setHeader("refresh","3");//response.setHeader("refresh","3;url=''");
	//以上代码很少使用,因为输出数据最终由Jsp输出,开发常用方法:
	response.setCharEncoding("UTF-8");
	response.setContentType("text/html;charset=utf-8");
	String message="<meta http-equiv='refresh' content='3;url='>恭喜你,本浏览器3秒后自动跳转";//<meta>标签模拟头
	this.getServletContext().setAttribute("message",message);
	//使用此对象不合适的,此处只是为了举例
	this.getServletContext().getRequestDispatcher("").forward(respuest,response);
7)控制缓存:
	response.setDateHeader("expires",System.currentTimeMillis()+1000*3600);
	//注意时间的设置
8)实现请求重定向 
方法一:
	response.setStatus(302);
	response.setHeader("location","");
方法二:
	response.setRedirect("");
减少使用重定向,增加服务器压力,登录时使用,为了在地址栏显示首页地址,还有购物,跳转购物车页面时使用转发会多购买一次,使用重定向则不会;
特点:浏览器会向服务器发送两次,意味着就有2个request\response;浏览器地址会变化
9)response细节
getOutputStream和getWriter()方法分别用于得到输出二进制数据、输出文本数据的ServletOutputStream、Printwriter;这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法(不只是在一个servlet中不能,在转发(不是重定向)到另一个servlet中两个servlet都不能使用了,注意调用链);
Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当做响应消息的正文,然后再与响应状态行和各响应头输出到客户端;
Servlet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用了close方法,如果没有,servlt引擎将调用close方法关闭该输出流对象(其他的流要注意关闭)。

request对象
1)HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
2)http://www.baidu.com/news/1.html URL/URI
/news/1.html URI
URI>URL:URI可以表示任何一个资源;URL只可以标识互联网上的资源
3)常用方法:
	getRequestURL方法返回客户端发出请求时的完整URL
	getRequestURI方法返回请求行中的资源名部分
	getQueryString方法返回请求行中的参数部分
	getRemoteAddr方法返回发出请求的客户机的IP地址
	getRemoteHost方法返回发出请求的客户机完整主机名(在DNS注册后才会返回,否则返回的是IP)
	getRemotePort方法返回客户机所使用的网络端口号
	getLocalAddr方法返回web服务器的IP地址
	getLocalName方法返回web服务器的主机名
	getMethod得到客户机请求方式
4)获取请求头和请求数据
获取请求数据(获取请求数据时一般来说都要先检查再使用)
if(value != null && value.trim().equals(""))
使用getParameterMap方法得到的map数值类型为Map<String, String[]>(应用:得到map集合后使用beanUtils可以直接封装在formbean里)
5)通过表单收集客户端数据
url后面跟的中文数据,要编码后再提交(看Jsp页面)
6)中文乱码问题
	//改变request使用的码表,否则为iso-8859-1,只对post有效
	request.setCharacterEncoding("UTF-8");//解决post提交的乱码
	//解决get提交的乱码(手工处理)
	String username = request.getParameter("username");
	username = new String(username.getBytes("iso8859-1"),"utf-8");
	//超链接提交的中文,服务器想不乱码,也只能手工处理
	、、、、、
	//也可以通过更改服务器设置,但是开发不使用,因为是远程部署到服务器,而且使用的web服务器也不一定使用哪个,这里讲的是tomcat服务器
	//通过查阅文档,Http->URLEncoding,改变connector的这个属性即可,或者useBodyEncodingForURI属性值设置为true;
7)request实现请求转发
请求转发指一个web资源收到客户端请求后,通知服务器去调用另一个web资源进行处理。应用场景(MVC模式)request对象提供一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象forward方法可以实现请求转发。request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其他web资源处理。(setAttribute方法、getAttribute方法、removeAttribute方法、getAttributeNames方法)
	String data = "aaaaa";
	request.setAttribute("data",data);
	request.getRequestDispatcher("/message.jsp").forward(request,response);
8)froward细节
__1froward方法用于将请求转发到RequestDispatcher对象封装的资源
__2如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传动到了客户端,forward方法将抛出IIIlegalstateException异常
	//案例一:
	String data = "aaa";
	PrintWriter writer = response.getWriter();
	writer.write(data);
	writer.close();
	//以下跳转会导致:java.lang.IllegalStateException:Cannot forward after response has bean ...
	request.getRequestDispatcher("/message.jsp).forward(request,response);
	//案例二(错误类型如案例一):
	//养成习惯,前面调用转发后一定加上return,否则会有以上异常
	if(true){
		request.getRequestDispatcher("/message.jsp).forward(request,response);
		return;
	}
	request.getRequestDispatcher("/message.jsp).forward(request,response);
__3如果在调用forward方法之前向Servlet引擎的缓冲区(response)写入了内容,只要写入到缓冲区中的内容还没有真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效。
	String data = "aaa";
	PrintWriter writer = response.getWriter();
	writer.write(data);
	//writer.close();没有关闭流,没有写入客户端,会清空,但是加上注意会报异常
	request.getRequestDispatcher("/message.jsp).forward(request,response);
9)mvc设计模式((model javabean)、(view jsp)、(control servlet))
10)用include实现页面包含(被包含页面不要出现全局架构标签,因为全部内容都被包含了进去):
	request.getRequestDispatcher("head.jsp").include(request,response);
	response.getWriter().writer("hhhhh<br/>");
	request.getRequestDispatcher("foot.jsp").include(request,response);
11)web工程中各类地址的写法(绝对路径):
tip:获取的资源是服务器使用的,/代表web应用;获取的资源是浏览器使用的,/代表网站
	request.getRequestDiapatcher("").forward(request,response);//服务器
	response.sendRedirect("");//浏览器
	this.getServletContext().getRealPath("");//服务器 
	this.getServletContext().getResourceAsStream("");//服务器
	<a href="">content</a>//浏览器
	<from antion=""></form>//浏览器
另一种使用相对路径,以后应用中再理解
12)防盗链
	String referer = reequest.getHeader("referer");
	if(referer==null || ! referer.startsWith("")){
		response.sendirect("");
		return;
	}
	...

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值