javaee总结
HTTP协议
HTTP协议 超文本传输协议,主要是用来传输文本、音频、视频、图片等资源信息。
协议就是一个条款,甲方应该尽什么样的义务,有什么权力;乙方应当尽什么样的义务,有什么样的权利
本质:发送怎么发送,接收怎么接收,都要遵守这个规定
传输包括请求行(协议等),请求头,请求体
响应包括响应行,响应头,响应体
工作流程
工作流程:
以在浏览器窗口输入http://www.baidu.com为例
1.域名解析():最终结果就是将域名转成ip地址。
2.建立一个可靠连接:TCP三次握手。为什么要进行三次握手?网络通讯的不可靠性。
3.发送HTTP请求(HTTP请求和HTTP协议是什么关系呢?HTTP协议就是用来规范HTTP请求应该怎么发,HTTP响应应该怎么发,应该具有某种规则,这样才可以正常地进行解析),比如
提交方式
GET和POST请求方式的区别就在这吗?
注意,GET和POST请求方式的区别不是因为这个,这个仅仅是浏览器的行为。
真正的区别是在于语义的区别。
制定这两个请求方法的时候,就规定
GET的语义就是用来获取资源,比如说你看到一个商品想分享给别人
POST的语义就是用来提交数据,注册、登录
Servlet
合成词。Servlet = Server + applet。服务器上面的一个小程序。
工作流程
<servlet>
<servlet-name>second</servlet-name>
<servlet-class>com.cskaoyan.servlet.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>second</servlet-name>
<url-pattern>/second</url-pattern>
</servlet-mapping>
1.请求到达服务器tomcat之后,被监听80端口的Connector接收到,将其解析成为Request对象,同时还生成一个Response对象
2.将这两个对象传给Engine,Engine挑选一个Host进行后续逻辑处理
3.Host来挑选一个合适的Context来处理,将这两个对象交给app Context来处理
4.web.xml中配置了一个映射关系,tomcat在启动的时候,Context可以拿到对应的映射关系。
/first FirstServlet
根据有效请求/first去寻找有没有对应的class,找到FirstServlet.class
利用反射实例化该对象 Class.forName.newInstance
执行该对象的service方法。-----因为它时Servlet,实现了Servlet接口,肯定有service方法
5.Context处理完毕之后,依次返回两个对象给Host、Engine、Connector,Connector读取Response里面的数据生成响应报文,发送出去
url-pattern
1.一个servlet可以设置多个url-pattern吗?可以
servlet>
<servlet-name>life</servlet-name>
<servlet-class>com.cskaoyan.servlet.life.LifeCycleServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>life</servlet-name>
<url-pattern>/life1</url-pattern>
<url-pattern>/life2</url-pattern>
</servlet-mapping>
@WebServlet(value = {"
life1","/life2"},loadOnStartup = 1)
缺省Servlet
为什么我们设置了/ *之后,显示的就是/ * 而不再是原先的jsp了呢?
原先是因为 / 的优先级高于 * .jsp,始终无法访问到jspServlet
/* /同时存在,无论访问jsp还是访问html均无法正常访问,显示的均是 / *
/ *注释之后,jsp可以正常访问到,但是html仍然无法正常访问到,显示的是 /
/其实是一个缺省servlet,当一个请求到达应用,如果没有任何的servlet的url-pattern可以i处理该请求,那么就会调用缺省servlet来处理。
结论:访问静态资源时,有没有servlet参与进来?有servlet参与进来,那就是缺省servlet。
ServletContext
再每一个应用中,有且只有一个servletContext对象,当前应用下的任何的servlet都可以拿到该context对象的引用。
主要代码
//获得初始化参数
ServletContext servletContext = getServletContext();
String name = servletContext.getInitParameter("name");
System.out.println(name);
web.xml
<context-param>
<param-name>name</param-name>
<param-value>shuaige</param-value>
</context-param>
context域
一块内存空间,可以再这快内存空间里面进行数据的共享。比如局域网 27th 26th
ServletContext servletContext = getServletContext();
servletContext.setAttribute("key", "ligenli");
//只要再一个应用中,不管任何servlet,拿到的全部都是同一个servletContext对象的引用
ServletContext servletContext = getServletContext();
String key = (String) servletContext.getAttribute("key");
System.out.println(key);
获取EE项目绝对路径
//servletContext可以给我们提供一个API,利用这个API可以获取到EE项目文件的绝对路径
ServletContext servletContext = getServletContext();
//如果里面什么参数都不输入,这个时候可以定位到应用部署根目录
//如果你希望获取部署根目录下的任何一个文件的路径信息,只需要指明它和部署根目录之间的相对路径关系即可
String realPath = servletContext.getRealPath("");
System.out.println(realPath);
cookie
cookie是一小部分数据,服务器产生给客户端,客户端再次访问会携带这部分数据
优势:很轻便、使用的话也很方便,数据存储在客户端,服务器压力小一些
劣势:数据存储在客户端,数据安全性就比较低,cookie一般只存储一些非敏感数据;只能存储字符串类型,受限;大小一般4kb
Cookie cookie = new Cookie("username", username);
response.addCookie(cookie);
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie cookie : cookies) {
if("username".equals(cookie.getName())){
response.getWriter().println("欢迎您, " + cookie.getValue());
}
}
}
session
服务器技术。数据的产生以及保存都是在服务器里面进行的。Session可以保存Object
客户端在访问服务器时,服务器会给当前的客户端开辟一块内存空间,这块内存空间专门用来给这个客户端服务,后续关于这个客户端的任何数据的共享都可以在这个区域里面进行。如何绑定呢?
可以利用cookie来传输内存空间(对象 Session)的唯一标识码 JSESSIONID。
HttpSession session = request.getSession();
session.setAttribute("username", username);
String username = (String) session.getAttribute("username");
request.getSession().invalidate();