Http协议制定客户端与服务器端的通讯格式
Http协议一定一问一答
问: 请求消息 请求行:请求方式get和post的区别 消息头:referer
答: 响应消息 响应消息: 压缩方式 Accept-Encoding
通知对方下载: content-disposition:attachment;filename=文件名
1) 配置虚拟目录 : 发布到webapps目录下的web应用 tomcat会自动做映射
2)配置虚拟主机 : 服务器根据浏览器发送的Host头来决定访问哪台虚拟主机
虚拟主机需要被外界访问,其名称一定要和在dns上注册的域名一致
在web.xml文件中怎么做映射
域对象 : 可以当map集合用,它有自己的生命周期
class ServletContext {
private Map< String, Object> map = new HashMap();
}
在web工程中读取文件一律用ServletContext对象来实现
在其他工程中无法获得ServletContext对象,只能使用类加载的方式读
类加载方式缺点: 文件会先加载到内存,所以容易导致内存的溢出
监测不到硬盘上文件的改变
只能读取类路径下的文件(classpath中配置的目录)
获得提交的参数信息 getParameter() | Enumeration getPameterNames()
域对象
请求转发 RequestDispatcher 转发对象
发送数据OutputStream getOutputStream | PrintWriter getWriter 只能调一个
发送响应消息头:
防止中文乱码 response.setContentType(“text/html;charset=utf-8”)
做下载:
response.setContentType(“application/octet-stream”);
content-disposition:attachment;filename=文件名
请求重定向:
sendRedirect
发送302状态码 和 location头
cookie : 当用户来访问服务器,服务器需要记住每个用户的一些信息, 发送给用户浏览器存起来
设置有效时间,不设置仅在浏览器进程有效
session: 将用户的信息存入一个Session对象(域),将Seesion对象的id作为cookie发送给客户端
Session的实现也是基于Cookie的,多个浏览器是否共享一个Session不是Session决定的
是Cookie的有效时间决定的
Session对象也是有有效时间的, 默认30分钟, 我们可以设置
jsp的特点:
1) 写jsp就像在写html 所以做数据美化很方便, jsp的特点就是能写java代码
2) jsp中不适合写复杂的java代码
3) 在jsp页面中禁止写java代码
4) 在jsp页面中避免不了要写java代码,
jstl自定义标签、el表达式两个技术就是用于移除jsp页面中的java代码
servlet 和 jsp 都用在哪
Servlet适合写大量的java代码,所以用于处理用户的请求,进行逻辑判断
jsp负责做数据的输出,因为它可以轻松地对数据进行美化
import 导包 多个包用逗号隔开
session 指定是否使用session
errorPage 指定出错跳转的页面
也可以在web.xml文件中进行配置
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
我们需要阅读文字,就需要用到码表, 字符—> 字节 为编码过程 字节->字符 解码过程
编码和解码使用了不同码表就会出现乱码
1) 我们的程序接错码, 需要知道错误的码表,编码回去,再用正确的码表解码
2) 别的程序解析我们的文件解错码, 需要告诉对方我们使用码表
ServletContext application Servlet的上下文路径
ServletConfig config
HttpServletResponse response
HttpServletRequest request
HttpSession session jsp配置了 page指令 session=true(默认) 的情况下才有
this page
Throwable exception jsp配置了 isErrorPage=”true”的情况下才有
JspWriter out 向ie输出数据 response.getWriter 获得一个PrintWriter
out 就是 PrintWriter的缓冲流
PageContext pageContext jsp页面的上下文
可以作为域对象,被称作page域
有个方法是 findAttribute() 可以从四个域中根据指定的key去取值,从范围小的开始找
pageContext.getRequest().getAttribute();
最重要的作用就是可以获得其他8个隐式对象
标签和el表达式都是用于移除jsp中的java代码
所有的java代码都可以移到另一个java类的方法中,然后再复用代码
但是,如果用到了九大隐式对象,这样的java代码就不容易移到方法中,为了能移到方法中需要将九个对象传给方法
一个比较方便的做法就是将pageContext对象传递给后台的方法,在方法中可以轻松地获得其他8个对象
pageContext(称之为page域) PageContext
request (称之为request域)HttpServletRequest
session (称之为session域)HttpSession
application(称之为application域)ServletContext
这4个对象的生命周期?
page: jsp页面被执行到执行完毕
request: 浏览器发送请求到当次请求结束
浏览器发送请求,web容器创建request对象,请求结束,该对象销毁
session: 开始一个会话,服务器创建session,一直到session失效
application: web应用发布到服务器,服务器启动,对象就创建,直到web应用被移除或服务器关闭
该对象被销毁
什么是域?为什么把这4个对象叫做域对象呢?
域即范围, 这4个对内部都维护了map集合,可以存储数据,这4个对象都有固定的生命周期和作用范围,所以被称作域对象
四个域的范围(作用域)
page: 只在当前jsp页面有效
request: 只在一次请求中有效
session: 只在当前会话有效
application: 整个web应用都有效
哪种情况下用哪种域对象。
page: 想在页面用map就用page
request: 需要显示数据给浏览器看完了就没用了,就存在request域 (典型应用请求转发)
session: 数据给用户看完了,一会还有用,就存在session域
比如,用户登陆,购物车
典型应用: 请求重定向
application: 数据给用户用完了,别的用户也要用
比如,聊天信息、统计在线人数
四个域的范围是从小到大的: page、request、session、application
使用的时候有个原则: 小的域对象能搞定的绝对不用大的
特点:
必须有无参的构造函数
属性私有(字段)
对外要暴露共有的 getter 或 setter
请求参数封装到javabean的通用方法
public class WebUtils {
private WebUtils(){}
// 通用方法 将请求参数封装到bean
public static <T> T request2Bean(HttpServletRequest request, Class<T> clazz) {
try {
// 创建 javabean
T bean = clazz.newInstance();
// 注册一个转换器
ConvertUtils.register(new DateLocaleConverter(), Date.class);
// 获得所有的参数名称
Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
String value = request.getParameter(name);
BeanUtils.setProperty(bean, name, value);
}
return bean;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
sun公司针对web开发提供了两种开发模式
model1: jsp+javabean 只适合开发小型的应用
model2: servlet+jsp+javabean (mvc)
问题:
getParameter(key)、getAttribute(key)/setAttribute()有什么区别 什么时候用
class Request {
Map attributes = new HashMap(); // 作为域对象
Map parameters = new HashMap(); // 封装请求参数
Map headers = new HashMap();
getAttribute(key) {
return attributes.get(key);
}
getParameter(key) {
return parameters.get(key);
}
getHeader(name) {
}
}