Tomcat软件架构C/S架构: Client/Server
优点:服务器压力相对比较小,速度快
缺点:需要下载客户端软件,总去更新
B/S架构: Browser/Server
缺点:所有代码都在服务器运行,服务器压力比较大
优点:服务器端更新,客户端浏览器不需要进行更新
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协议的特点:
基于请求和响应的模型.
必须先有请求后有响应.
请求和响应必须成对出现.
默认的端口号是80.
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一起使用查找本地缓存.
请求体
响应部分
ServletServlet的实现和继承的关系
Servlet :接口
|
GenericServlet :通用的Servlet
|
HttpServlet :HttpServlet
servlet的生命周期
生命周期:就是一个对象从创建到销毁的过程.
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域中存放了数据:转发能够获得到数据,重定向不能获得到数据
路径的编写:转发不带工程名,重定向带工程名
跳转的范围:转发只能在当前工程下跳转,重定向可以跳转至任意网页
Cookie获得Cookie:Cookie[] cookies = request.getCookies();
向客户端写Cookie:response.addCookie(Coookie cookie)
创建Cookie:Cookie cookie = new Cookie(String name,String value);
作用范围:默认是一次会话,关闭浏览器就销毁,可以设置Cookie的有效期
关于cookie存储中文的问题:
向客户端写Cookie:
String value = URLEncoder.encode("中文", "UTF-8");
Cookie cookie = new Cookie("name",value);
response.addCookie(cookie);
获得Cookie:
Cookie [] cookies = request.getCookies();
Cookie aa= CookieUtils.findCookie(cookies, "name");
if(name!=null){
String value = aa.getValue();
String a = URLDecoder.decode(value, "utf-8");
}
Session(HttpSession)JSPJSP的脚本<%! %> :翻译成Servlet中的成员内容. 定义变量,方法,类. -- 不建议使用.
<% %>:翻译成Servlet中service方法内部的内容. 定义类,变量
<%= %>:翻译成Servlet中service方法中out.print();注:里面的代码不用写分号
JSP的注释JSP的指令JSP指令的语法JSP的三个指令page指令language:JSP脚本中使用的语言,现在只能写java
contentType:设置浏览器打开这个JSP的时候采用的默认的字符集的编码
pageEncoding:设置文件保存到本地硬盘,以及生成Servlet后,Servlet保存到硬盘上的编码
import:在JSP中引入类对象,可以出现多次
extends:设置JSP翻译成Servlet后继承的类,默认值:org.apache.jasper.runtime.HttpJspBase,这个值要想修改,这个类必须是HttpServlet的子类
autoFlush:设置JSP的缓存自动刷出.true:自动刷出.
buffer:设置JSP的缓冲区的大小,默认8kb.
session:设置在JSP中是否可以直接使用session对象.默认值是true.
isELIgnored:设置在JSP中是否忽略EL表达式.默认值是false不忽略.
errorPage:设置错误友好页面的提示.
isErrorPage:通过这个设置显示JSP的错误信息.
include指令指示JSP包含(静态包含)其他的页面,注被包含的页面不需要写结构体
<%@ include file="相对路径" %>
taglib指令指示JSP引入标签库
<%@ taglib uri="标签的URI的路径" prefix="标签的别名" %>
JSP的9大内置对象对象名 | 对应的Servlet对象 |
request | HttpServletRequest |
responsse | HttpServletRequest |
session | HttpSession |
application | ServletContext |
page | Object |
pageContext | PageContext |
config | ServletConfig |
out | JspWriter |
exceeption | Throwable |
域范围名称 | 作用范围 | 对应的内置对象 | 对应的Servlet对象 |
PageScope | 当前页面 | pageContext | PageContext |
RequestScope | 一次请求范围 | request | HttpServletRequst |
SessionScope | 一次会话范围 | session | HttpSession |
ApplicationScoope | 应用范围 | application | ServletContext |
JSP的动作标签作用:简化代码
<jsp:forward page="路径"></jsp:forward>:用于页面转发
<jsp:include page="路径"></jsp:include>:用于页面的包含(动态包含)
动态包含和静态包含的区别?(<%@ include page="路径" %>和<jsp:include file="相对路径" page>的区别)
静态包含相当于代码的copy,指挥翻译成一个java类,只有一个执行结果
动态包含的各个jsp各自翻译,执行,最终包含的是执行的结果
EL表达式语法:
功能:
获取数据(JSP的四个域中的数据)
执行运算
操作web开发的常用的对象
调用Java中的方法----很少用
EL获取数据EL执行运算算术运算${ n1 + n2 + n3 }
逻辑运算
${ n1 < n2 } - ${ n1 lt n2 } <!-- less than -->
${ n1 > n2 } - ${ n1 gt n2 } <!-- great than -->
${ n1 <= n2 } - ${ n1 le n2 } <!-- less equal -->
${ n1 >= n2 } - ${ n1 ge n2 } <!-- great equal -->
${ n1 == n2 } - ${ n1 eq n2 } <!-- equal -->
关系运算
${ n1<n2 && n3 < n4 } - ${ n1<n2 and n3 < n4 }
${ n1<n2 || n3 < n4 } - ${ n1<n2 or n3 < n4 }
${ !(n1 < n2) } - ${ not(n1<n2) }
EL操作常用的web对象JSTLJSTL的标签库:包含了五类标签.
core(核心标签),fmt(国际化标签),xml(XML标签),sql(SQL标签),fn(JSTL提供EL的函数库)
使用JSTL:
JSTL中的判断
<c:if test="${}">
test:如果test返回true,标签内的内容就会被输出
</c:if>
if标签没有else,如果想表达else的情况,从条件着手
JSTL中的遍历
<c:forEach var="" items="" varStatus="status">
status.index
status.count
</c:forEach>
<c:forEach var="" begin="" end="" step="" varStatus="status">
</c:forEach>