J2EE开发之servlet
一.servlet调用原理:(如:浏览器敲入“http://localhost:8080/Logistics/servletdemo”)
1.ie浏览器连接上服务器
2.ie浏览器会通过http协议把信息发给服务器
3.服务器得到请求信息,解析出主机名称,访问web资源等信息
4.第一次访问的话会创建servletdemo对象
5.调用servletdemo中的init()方法完成对象初始化,
6.服务器会创建request和response对象传给service方法,
7.servletdemo中在service方法中吧信息写入response对象中,完成后返回给服务器
8.服务器从response对象中获得数据构建出一个http相应回写给ie浏览器
9.ie浏览器获得http响应获得数据显示。
二.servlet生命周期:
第一次访问servlet会创建对象在init中创建,然后调用service方法,当servlet对象被摧毁时(关闭web服务器或者移除web应用)会调用destory()方法。init只会调用一次,
但是如果在web.xml文=文件中配置<load-on-startup>1<load-on-startup>时会在启动服务器是启动,
这中技术用在Struts框架开发 中。
三.servlet是一个接口,有genericservlet直接实现类,还有一个httpservlet继承了genericservlet在原有的基础上
加了处理http请求的方法,在复写service方法中会根据请求的方式不同调用不同的方法执行,所以开发人员
通常会继承后者只需复写doGet doPost方法即可。
四.servlet在web.xml文件中的配置问题:
<servlet-name></servlet><servlet-class></servlet>
<servlet-name></servlet><servlet-mapping></servlet>
1.一个servlet可以映射到多个url地址上,也可以使用通配符但是只有两种固定格式,1是/开头,*结尾 “/*”
另一种是*.扩展名,
2.如果url只写/,代表如果 有请求找不到处理的servlet他会请求一个默认的servlet,
如静态web资源的访问就是这个原理,访问1.html因为找不到处理的servlet服务器会调用某人的servlet解析
要访问的静态外部资源,如果找不到则会返回404错误。
五.servlet在创建时会创建request,response,servletconfig,servletcontext,cookie,session等对象。
1.servletconfig:在web.xml文件中会使用<init-param>封装一些数据,而在创建servlet是服务器会自动把
这写数据信息分装到servletconfig对象中,并传给servlet。
2.servletcontext:把web应用封装成对象存储起来,
一个web应用中的所有servlet共享同一个servletcontext实现数据共享,
可以读取整个web应用的配置初始化参数<context=param>
可以实现转发,读取资源文件。
3。response:response对象是服务器封装数据以http相应的方式返回给浏览器,
1.response相关乱码的问题:
在向浏览器写数据时response提供了outputStream()字节流和PrintWriter字符流两种方式
(1) response.getOutputStream().write("你好".getBytes("UTF-8"));这句话意思是服务器使用utf-8码表
把你好转换成字节写给浏览器,如果浏览器不是使用指定的utf-8的码表转换字节为文本
那么就会出现乱码,这时候就需要response.setHeader("content-type", "text/html;charset=UTF-8");
应http相应头的方式告诉浏览器使用utf-8码表解析数据另一种方式是使用<meta>标签,
底层原理也是设置http响应头<meta http-equiv='content-type' content='text/html;charset=utf-8' >
(2)response.getWriter().write("你好");出现乱码是因为服务器会一默认的ISO-8859-1码表进行对字符
的转换,所以使用response.setCharacterEncoding("UTF-8");设置服务器要查找的码表为utf-8
然后设置相应头response.setHeader("content-type", "text/html;charset=UTF-8");
2.response 实现文件下载
String path = this.getServletContext().getRealPath("/images/bg.jpg");
String filename = path.substring(path.lastIndexOf("\\")+1);
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
OutputStream out;
InputStream in;
in = new FileInputStream(new File(path));
out = response.getOutputStream();
int len;
byte buff[] = new byte[1024];
while((len=in.read(buff))!=-1){
out.write(buff,0,len);
}
in.close();
out.close();
response实现定时刷新:response.setHeader("refresh","3;url='web/message.jsp' ");
response控制浏览器缓存:
response.setDateHeader("expires",System.CurrentTimeMillis()+1000*3600);
这句话的作用是通过http相应告诉浏览器在从现在开始一年的时间内访问这一个资源就不用发送
http请求,因为他控制访问的资源存入到客户机内。
resonse:请求重定向和转发
请求重定向:1.客户机向服务器发送一次请求,服务器返回要访问的地址让
客户机自己再次请求服务器,也就是客户机向服务器发送两次请求产生两个request
,response
2.客户机地址栏发生变化(用在用户登录,地址栏发生变化提示用户)
转发:
1.客户机向服务器发送一次请求,服务器直接跳转到要访问的页面
也就是客户机向服务器发送两次请求产生一个request,response
2.客户机地址不发生变化
4.request:
1.request处理乱码问题,对于客户机通过post提交过来的数据
通过request.setCharacterEncoding("UTF-8");设置服务器要解析数据使用utf-8码表
对于get提交过来的数据
使用new String (request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");来处理
post数据提交方式是吧数据封装到form体中传给服务器,比较安全而get方式是通过url方式传给
服务器,不安全。