1. IDEA
IDEA的特色功能
智能选取
丰富的导航模式
历史记录功能
编码辅助
灵活的排版功能
代码检查
完美的自动代码完成
版本控制的支持
-
IDEA常用快捷键
Alt+Insert 生成代码(如get, set方法,构造函数等) Alt+↑/↓ 在方法间快速定位 Alt+【F3】 查找相同文本,并高亮显示 Ctrl+B 快速打开光标处的类或方法 Ctrl+J 自动代码(main方法) Ctrl+N 查找类 Ctrl+Y 删除行 Ctrl+D 复制行 Ctrl+O 重写方法 Ctrl+E 最近打开的文件 Ctrl+F 查找文本 Ctrl+R 替换文本 Ctrl+P 方法参数提示 Ctrl+/ 单行注释// Ctrl+Shift+/ 多行注释/* */ Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Shift+↑/↓ 代码向上/向下移动 Shift+F6 重构-重命名
2.HTTP
-
HTTP协议
HTTP协议(Hypertext Transfer Protocol, 超文本传输协议),是一个客户端请求和响应的标准协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。用户输入地址和端口号之后就可以从服务器上取得所需要的网页信息。 通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。客户端发送给服务器的格式叫"请求协议";服务器发送给客户端的格式叫"响应协议"。 特点: 1.支持客户/服务器模式。 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 3.灵活:HTTP允许传输任意类型的数据对象。传输的类型由Content-Type加以标记。 4.无连接:无连接是表示每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 HTTP1.1 版本后支持可持续连接。通过这种连接,就有可能在建立一个 TCP 连接后,发送请求并得到回应,然后发送更多的请求并得到更多的回应.通过把建立和释放 TCP 连接的开销分摊到多个请求上,则对于每个请求而言,由于 TCP 而造成的相对开销被大大地降低了。而且, 还可以发送流水线请求,也就是说在发送请求 1 之后的回应到来之前就可以发送请求2。 也可以认为,一次连接发送多个请求,由客户机确认是否关闭连接,而服务器会认为这些请求分别来自不同的客户端。 5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送 的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
-
HTTP在浏览器中的书写格式
-
HTTP之URL
HTTP URL (URL 是一种特殊类型的 URI,包含了用于查找某个资源的足够的信息) 格式: http://host[:port]/[abc_path] http://IP(主机名/域名):端口/访问的资源路径 http 表示要通过 HTTP 协议来定位网络资源; host 表示合法的 Internet 主机域名或 者 IP 地址; port 指定一个端口号,为空则使用缺省端口 80; abs_path 指定请求资源的 URI; 如果 URL 中没有给出 abs_path,那么当它作为请求 URI 时,必须以“/”的形式给出,通常 这个工作浏览器自动帮我们完成。
-
HTTP请求
HTTP请求由三部分组成,分别是: 请求行、请求头、请求正文。 1.Get请求(没有请求体)。 2.Post请求。 格式 请求行 请求头1 请求头2 … 请求空行 请求体 请求行以一个方法符号开头,以空格分开,后面跟着请求的 URI 和协议的版本。 格式:Method Request-URI HTTP-Version CRLF Method 表示请求方法; Request-URI 一个统一资源标识符; HTTP-Version 表示请 求的 HTTP 协议版本; CRLF 表示回车和换行;
-
HTTP响应
HTTP响应由三个部分组成,分别是: 状态行、消息报头、响应正文。 格式 状态行 响应头1 响应头2 … 响应空行 响应体
-
消息头
HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行), 消息报头(可选),空行(只有 CRLF 的行),消息正文(可选)组成。 每一个报头域都是由名字+":"+空格+值组成,消息报头域的名字是大小写无关的。 请求头: 请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。 Referer:该请求头指明请求从哪里来。 响应头: 响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和 对 RequestURI 所标识的资源进行下一步访问的信息。 Location:Location响应报头域用于重定向接受者到一个新的位置。 Location响应报头域,常用在更换域名的时候。 Refresh:自动跳转(单位是秒),可以在页面通过meta标签实现,也可在后台实现。
3. Tomcat服务器
Tomcat 简单的说就是一个运行 Java的网络服务器,底层是 Socket 的一个程序,它也是 JSP 和 Servlet 的一个容器。
-
Tomcat目录结构
1.bin:启动和关闭tomcat的bat文件。 2.conf:配置文件server.xml 该文件用于配置server相关的信息,比如 tomcat 启动的端口号,配置主机(Host) ;web.xml文件配置与web应用(web 应用相当于一个web站点);tomcatuser.xml 配置用户名密码和相关权限。 3.lib:该目录放置运行tomcat运行需要的jar包。 4.logs:存放日志,当我们需要查看日志的时候,可以查询信息。 5.webapps:放置我们的web应用。 6.work 工作目录:该目录用于存放jsp被访问后生成对应的 server 文件和.class 文件。 注意:Tomcat默认占用端口8080。(注意端口冲突问题)。
4. Servlet
-
Servlet的实现
Servlet是Server与Applet的缩写,是服务端小程序的意思。(言外之意:要实现 web 开发,需要实现 Servlet 标准) Servlet本质上也是Java类,但要遵循Servlet规范进行编写。(言外之意:写自己的类,不用写 main 方法,别人自动调用) Servlet是和HTTP协议是紧密联系的,其可以处理HTTP协议相关的所有内容。 提供了Servlet功能的服务器,叫做Servlet容器,其常见容器有很多,如Tomcat, Jetty, WebLogicServer, WebSphere, JBoss等等。 pom.xml中添加: <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
-
实现Servlet规范
实现Servlet规范,即继承 HttpServlet 类,并到如响应的包,该类中已经完成了通信的规则,我们需要进行业务的实现即可。 public class Servlet01 extends HttpServlet {}
-
重写service方法
满足 Servlet 规范只是让我们的类能够满足接收请求的要求,接收到请求后需要对请求进行分析,以及进行业务逻辑处理,计算出结果,则需要添加代码,在规范中有一个叫做 service的方法,专门用来做请求处理的操作,业务代码则可以写在该方法中。 @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
-
设置注解
在完成好了一切代码的编写后,还需要向服务器说明,特定请求对应特定资源。 @WebServlet("/资源") 用注解配置Servlet @WebServlet(name="Servlet01",value="/ser01") @WebServlet(name="Servlet01",urlPatterns = "/ser01") 也可以配置多个访问路径 @WebServlet(name="Servlet01",value={"/ser01",'/ser001'}) @WebServlet(name="Servlet01",urlPatterns={"/ser01",'/ser001'})
-
Servlet的工作流程
1.通过请求头获知浏览器访问的是哪个主机。 2.再通过请求行获取访问的是哪个一个web应用。 3.再通过请求行中的请求路径获知访问的是哪个资源。 4.通过获取的资源路径在配置中匹配到真实的路径。 5.服务器会创建servlet对象,(如果是第一次访问时,创建servlet实例,并调用init方法进行初始化操作)。 6.调用service(request, response)方法来处理请求和响应的操作。 7.调用service完毕后返回服务器 由服务器讲response缓冲区的数据取出,以http响应的格式发送给浏览器。
-
Servlet的生命周期
生命周期,指的是servlet容器何时创建servlet实例、何时调用其方法进行请求的处理、 何时并销毁其实例的整个过程。 1.实例和初始化时机 当请求到达容器时,容器查找该servlet对象是否存在,如果 不存在,则会创建实例并进行初始化。 2.就绪/调用/服务阶段 有请求到达容器,容器调用servlet对象的service()方法,处理请求的方法在整个生命周期中可以被多次调用; HttpServlet 的 service()方法,会依据请求方式来调用doGet()或者doPost()方法。但是, 这两个do方法默认情况下,会抛出异常,需要子类去 override。 3.销毁时机 当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。 在Servlet中有三个生命周期方法,不由用户手动调用,而是在特定的时机有容器自动调用,观察这三个生命周期方法即可观察到Servlet的生命周期。 1.init 方法,在Servlet实例创建之后执行(证明该Servlet有实例创建了) public void init(ServletConfig config) throws ServletException { System.out.println("实例创建了..."); } 2.service方法,每次有请求到达某个Servlet方法时执行,用来处理请求(证明该Servlet 进行服务了) protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("服务调用了..."); } 3.destroy 方法,Servlet实例销毁时执行(证明该 Servlet 的实例被销毁了) public void destroy() { System.out.println("实例销毁了..."); } Servlet的生命周期,简单的概括这就分为四步: servlet类加载-->实例化-->服务-->销毁。
-
Tomcat与Servlet的时序图
1.Web Client向Servlet容器(Tomcat)发出Http请求。 2.Servlet容器接收Web Client的请求。 3.Servlet容器创建一个HttpServletRequest对象,将Web Client 请求的信息封装到这个对象中。 4.Servlet容器创建一个HttpServletResponse对象。 5.Servlet容器调HttpServlet对象service方法,把Request与Response作为参数,传给HttpServlet。 6.HttpServlet调用HttpServletRequest对象的有关方法,获取 Http请求信息。 7.HttpServlet调用HttpServletResponse对象的有关方法,生成响应数据。 8.Servlet容器把HttpServlet的响应结果传给Web Client。
-
Web
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的 response 对象。 request和response对象代表请求和响应: 获取客户端数据,需要通过request对象;向客户端输出数据,需要通过response对象。
-
HttpServletRequest对象
主要作用是用来接收客户端发送过来的请求信息。 例如:请求的参数,发送的头信息等都属于客户端发来的信息。 service()方法中形参接收的是HttpServletRequest接口的实例化对象,表示该对象主要应用在HTTP协议上,该对象是由Tomcat 封装好传递过来。 HttpServletRequest是ServletRequest的子接口,ServletRequest只有一个子接口,就是HttpServletRequest。
-
接收请求
-
获取请求参数
1.请求乱码问题 方式一:request.setCharacterEncoding("UTF-8"); 这种方式只针对POST有效(必须在接收所有的数据之前设定) 方式二:new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8"); 借助了String对象的方法,该种方式对任何请求有效,是通用的。 Tomcat8起,以后的GET方式请求是不会出现乱码的。 2.请求转发 请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改变, 得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。 request.getRequestDispatcher(url).forward(request,response); 3.request作用域 通过该对象可以在一个请求中传递数据, 作用范围:在一次请求中有效,即服务器跳转有效。 //设置域对象内容 request.setAttribute(String name, String value); //获取域对象内容 request.getAttribute(String name); //删除域对象内容 request.removeAttribute(String name); request域对象中的数据在一次请求中有效,则经过请求转发,request域中的数据依然存在,则在请求转发的过程中可以通过 request 来传输/共享数据。
-
HttpServletResponse对象
主要功能是用于服务器对客户端的请求进行响应,将Web服务器处理后的结果返回给客户端。 service()方法中形参接收的是HttpServletResponse接口的实例化对象,这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。 1.响应数据 接收到客户端请求后,可以通过HttpServletResponse对象直接进行响应,响应时需要获取输出流。有两种形式: 1.getWriter() 获取字符流(只能响应回字符) //字符输出流 PrintWriter writer = response.getWriter(); writer.write("Hello"); writer.write("<h2>Hello</h2>"); 2.getOutputStream() 获取字节流(能响应一切数据) //字节输出流 ServletOutputStream out = response.getOutputStream(); out.write("Hello".getBytes()); out.write("<h2>Hello</h2>".getBytes()); 响应回的数据到客户端被浏览器解析。 注意:两者不能同时使用。 设置响应类型,默认是字符串 //设置响应MIME类型 response.setHeader("content-type","text/html"); // html 2.响应乱码问题 在响应中,如果我们响应的内容中含有中文,则有可能出现乱码。 这是因为服务器响应的数据也会经过网络传输,服务器端有一种编码方式,在客户端也存在一种编码方式,当两端使用的编码方式不同时则出现乱码。 1.getWriter()的字符乱码 对于getWriter()获取到的字符流,响应中文必定出乱码,由于服务器端在进行编码时默认会使用ISO-8859-1格式的编码,该编码方式并不支持中文。 要解决该种乱码只能在服务器端告知服务器使用一种能够支持中文的编码格式 response.setCharacterEncoding("UTF-8"); 要保证数据正确显示,还需要指定客户端的解码方式。 response.setHeader("content-type", "text/html;charset=UTF-8"); 保证发送端和接收端的编码一致 或 同时指定服务器和客户端 response.setContentType("text/html;charset=UTF-8"); 2.getOutputStream()字节乱码 对于getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节, 所以此时可能出现乱码,也可能正确显示。 当服务器端给的字节恰好和客户端使用的编码方式一致时则文本正确显示,否则出现乱码。 指定客户端和服务器使用的编码方式一致。 //设置客户端的编码及响应类型 ServletOutputStream out = response.getOutputStream(); response.setHeader("content-type","text/html;charset=UTF-8"); out.write("<h2>你好</h2>".getBytes("UTF-8")); 或 //设置客户端与服务端的编码 response.setContentType("text/html;charset=UTF-8"); 总结:要想解决响应的乱码,只需要保证使用支持中文的编码格式。并且保证服务器端 和客户端使用相同的编码方式即可。 3.重定向 重定向是一种服务器指导,客户端的行为。 重定向当中有两个请求存在。客户端发出第一个请求,被服务器接收处理后,服务器会进行响应,在响应的同时,服务器会给客户端一个新的地址(下次请求的地址response.sendRedirect(url);), 当客户端接收到响应后,会立刻、马上、自动根据服务器给的新地址发起第二个请求,服务器接收请求并作出响应,重定向完成。
-
请求转发与重定向的区别
-
ServletContext对象
每一个web应用都有且仅有一个ServletContext对象,又称 Application对象,从名称中可知,该对象是与应用程序相关的。 在WEB容器启动的时候,会为每一个WEB应用程序创建一个对应的ServletContext 对象。 两大作用: 1.作为域对象用来共享数据,此时数据在整个应用程序中共享; 2.该对象中保存了当前应用程序相关信息。 ServletContext对象的获取: 1.通过request对象获取 ServletContext servletContext = request.getServletContext(); 2.通过session对象获取 ServletContext servletContext = request.getSession().getServletContext(); 3.通过servletConfig对象获取,在Servlet标准中提供了ServletConfig方法 ServletConfig servletConfig = getServletConfig(); ServletContext servletContext = servletConfig.getServletContext(); 4.直接获取,Servlet类中提供了直接获取ServletContext对象的方法 ServletContext servletContext = getServletContext(); 常用方法 //获取项目存放的真实路径 String realPath = request.getServletContext().getRealPath("/"); //获取当前服务器的版本信息 String serverInfo = request.getServletContext().getServerInfo(); ServletContext域对象 ServletContext也可当做域对象来使用,通过向ServletContext 中存取数据,可以使得整个应用程序共享某些数据。 当然不建议存放过多数据,因为ServletContext中的数据一旦存储进去没有手动移除将会一直保存。 Servlet的三大域对象: 1.request域对象 在一次请求中有效。请求转发有效,重定向失效。 2.session域对象 在一次会话中有效。请求转发和重定向都有效,session销毁后失效。 3.servletContext域对象 在整个应用程序中有效。服务器关闭后失效。