黑马程序员技术交流社区
标题: 【石家庄校区】Tomcat&Servlet课堂笔记 [打印本页]
作者: 学习让我快乐啊 时间: 2018-5-21 17:59
标题: 【石家庄校区】Tomcat&Servlet课堂笔记
本帖最后由 学习让我快乐啊 于 2018-5-21 18:00 编辑
Tomcat
软件架构C/S架构: Client/Server
客户端和服务器端的软件,都是需要在PC端的软件,如 QQ,迅雷。
优点:一部分代码写到客户端,服务器压力相对比较小,速度快
缺点:服务器端更新,客户端都需要更新
B/S架构: Browser/Server
浏览器端和服务端的软件,不需要安装PC端,只要有一个浏览器即可。
缺点:所有代码都在服务器运行,服务器压力比较大
优点:服务器端更新,客户端浏览器不需要进行更新
Web的资源常见Web服务器(中间件)Apache:发布PHP的.LAMP:Linux Apache MySQL PHP.
IIS:发布ASP的.
WebSphere(was):IBM公司研发,收费的大型服务器软件,支持EE的所有的开发规范.
WebLogic:BEA公司研发,收发的大型服务器软件,支持EE的所有的开发规范.
Tomcat:Apache组织研发,免费的小型的服务器软件,支持Servlet/JSP的开发规范.
JBoss
Web动态资源目录结构 website
|-----静态资源
|-----WEB-INF
|-----web.xml :必须的
|-----classes :可选的
|-----lib :可选的Tomcat目录结构部署HTTP协议HTTP协议的详解请求部分
请求行
提交方式:
提交方式有很多,常用的GET和POST:
GET和POST的区别:
GET的提交的参数会显示到地址栏上,而POST不显示.
GET往往是有大小限制的,而POST没有大小的限制.
GET没有请求体,而POST有请求体.
提交路径
协议版本
请求头
都是键值对的形式显示的.一般一个key对应一个value,也有个别的是一个key对应多个value.
User-Agent:代表浏览器的类型. --- 文件下载:下载中文文件:IE使用-URLEncodor进行编码,而Firefox使用Base64编码.
Referer:代表的是网页的来源. --- 防盗链.
If-Modified-Since:通常与响应中的头Last-Modified一起使用查找本地缓存.
请求体
响应部分
Servlet
Servlet的实现和继承的关系
Servlet :接口
|
GenericServlet :通用的Servlet
|
HttpServlet :HttpServletservlet的生命周期
生命周期:就是一个对象从创建到销毁的过程.
Servlet生命周期:Servlet从创建到销毁的过程.
用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中init方法就会执行.任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.Servlet是单例的
思想:把耗时的操作放到服务器启动时执行
设置启动时创建ServletServlet默认是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置:
在web.xml中在<servlet></servlet>标签中配置:
<load-on-startup>2</load-on-startup> --- 传入正整数,整数越小,被创建的优先级就越高.(不能设置为1)
url-pattern的三种配置方式完全路径匹配:以/开始例如:/ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6
目录匹配:以 /开始 需要以*结束.例如:/* ,/aaa/* ,/aaa/bbb/*
扩展名匹配:不能以/ 开始 以* 开始的.例如: *.do , *.action
页面跳转的3种实现方式使用Servlet设置Refresh
response.setHeader("Refresh","时间(秒);url=路径");
等同于:
response.sendRedirect("路径");
使用JavaScript
<script type="text/javascript">
var second = 3;
window.onload = function() {
setInterval("changeSecond()", 1000);
}
function changeSecond() {
second--;
document.getElementById("secondSpan").innerHTML = second;
if (second == 0) {
location.href = "/zixi/download/download.jsp";
}
}
</script>
3.设置html中的<meta>标签
<meta http-equiv="refresh" content="0; url='http://www.qq.com/'">ServletContext对象作用用来获得全局初始化参数.
用来获得文件的MIME的类型.
作为域对象存取数据.
setAttribute(String name,String value);
getAttribute(String name);
removeAttribute(String name);
用来读取web项目下的文件
域对象作用范围:整个web工程.
创建:服务器启动的时候,tomcat服务器为每个web项目创建一个单独ServletContext对象.
销毁:服务器关闭的时候,或者项目从服务器中移除的时候.
读取web项目下的文件Response
处理中文乱码
设置浏览器默认打开编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
中文转成字节数组编码
response.getOutputStream().write("王守义".getBytes("UTF-8"));
设置response的缓冲区的编码
response.setCharacterEncoding("UTF-8");
设置浏览器默认打开的编码.
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");相当于上面两句
文件下载
public static void downloadFile(HttpServletRequest request,HttpServletResponse response) throws ClassNotFoundException, IOException{
String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
String type = request.getServletContext().getMimeType(filename);
InputStream is =request.getServletContext().getResourceAsStream("/downloadfiles/"+filename);
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Content-Type", type);
if(request.getHeader("User-Agent").contains("Firefox")){
filename = base64EncodeFileName(filename);
}else{
filename= URLEncoder.encode(filename);
}
response.setHeader("Content-Disposition", "attachment;filename="+filename);
OutputStream os = response.getOutputStream();
int len;
byte[] bys = new byte[1024];
while((len=is.read(bys))!=-1){
os.write(bys, 0, len);
}
is.close();
}
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
Request
获取客户端信息请求方式:request.getMethod();
请求ip:request.getRemoteAddr();
获取工程名:request.getContextPath();
获取表单参数String request.getParameter(String name);
String [] request.getParameterValues(String name);
Map<String,String[]> request.getParameterMap();
参数接收中的乱码处理POST乱码处理:
<form method=”post”>的时候,这种提交才是POST提交.其他的都是get.
POST方式提交的参数在请求体中.request对象在后台接收参数.request对象有缓存区.默认缓冲区的编码ISO-8859-1.
处理方式:设置request的缓冲区的编码.
request.setCharacterEncoding(“UTF-8”);
GET方式乱码处理:
作为域对象存取数据范围:一次请求和响应的范围
void setAttribute(String name,Object value);
Object getAttribute(String name);
void removeAttribute(String name)转发和重定向转发:request.getRequestDispatcher("不带工程名的路径").forward(request,response)
重定向:response.sendRedirect("带工程名称的路径")
区别:
地址栏:转发地址栏不变,重定向会变
请求响应的次数:转发一次请求一次响应,重定向是两次请求和响应
如果给request域中存放了数据:转发能够获得到数据,重定向不能获得到数据
路径的编写:转发不带工程名,重定向带工程名
跳转的范围:转发只能在当前工程下跳转,重定向可以跳转至任意网页
作者: Yin灬Yan 时间: 2018-5-22 11:35
我来占层楼啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |