以下内容为个人的学习笔记整理,如有错误,请指出,谢谢~
一、web开发背景知识
1、web的访问可以简单划分为两个过程:客户端请求、服务器端响应并显示结果。客户端的请求通过Servlet引擎传递给Servlet模块,web服务器接受到客户的请求,并把处理结果返回给客户,客户端之间的通信协议是HTTP超文本协议。
2、超文本传输协议:
①简单、快速:客户端向服务器请求服务时,只需要发生请求方法和路径URL。
②灵活:HTTP允许传输任意类型的数据,主要由Content-Type控制。
③无状态:指对于是数据库事务处理没有记忆能力,后续的处理如果需要前面的信息,就要重新发送。
④无连接:每次连接只处理一次请求,处理完当前请求后就断开连接。
3、静态网页和动态网页
①直接使用HTML标记语言编写的网页通常称为静态网页,展示的内容一般是固定不变的,内容更新麻烦,缺乏灵活性,维护成本高。
②动态网页中的变化内容大部分来自于数据库中的数据变化,通过增删改查等方式显示内容的变化。
③动态和静态是基于访问网页的内容有无变化,与页面的视觉效果无关。
4、web浏览器和web服务器
①web浏览器可以像服务器发送各种请求,并对从服务器中返回的各种信息进行解析、显示等。
②web服务器处理浏览器的请求并将结果返回给浏览器显示。比较流行的有WebSphere、WebLogic、Tomcat等。
③Tomcat是开源、基于java的一款轻量型web服务器。
5、开发环境搭建详细见上一个内容。
http://t.csdn.cn/9kIh3
二、Servlet基础
1、Servlet简介:Servlet是一个用java编写的程序,实现了Servlet接口的类,由web容器负责创建并调用服务器容器上运行,用于接收和响应用户的请求。
2、Servlet特点:
①在服务器容器上运行,处理客户端请求并且将响应返回客户端。
②移植性好,本身是一个java类,跨平台。
③对于客户端的请求,只需要创建Servlet实例一次,驻留在内存中,再次请求时无须加载。
3、Servlet接口:
①GenericServlet和HttpServlet都是Servlet接口的实现类,都是抽象类(继承关系)。
②如果继承GenericServlet,不管访问的方式的get还是post都会调用service()方法,GenericServlet实现了Servlet接口但没有实现service()方法。
③如果继承HttpServlet,如果是get提交方式会调用doGeta(),如果是post提交方式就会调用doPost(),HttpServlet实现了Servlet接口,也实现了service()方法。
4、Servlet注解
①常见Servlet配置方法:注解方式、xml文件、自定义容器。
②loaadOnStartup:表示Servlet应该被载入的顺序,如果该元素不存在或者为负数,则容器会当该Servlet被请求的时候再加载。正数的话,其值越小,那么Servlet的优先级越高,应用启动的时候越先加载。
③xml文件和注解方式:
5、Servlet的生命周期
①init()初始化
②service()执行
③destory()销毁
注意:默认情况下,服务器启动的时候Servlet对象没有被创建出来,在用户发送第一次请求的时候被实例化,然后Tomcat服务器才会马上调用init()方法。
init()方法只会在用户第一次请求的时候被调用(调用一次),service会在发送一次请求就调用一次,请求100次,就调用service()100次。destory()会在关闭服务器的时候执行一次,在摧毁对象内存之前调用。
6、ServletConfig接口:在Servlet运行期间,需要一些辅助信息。例如文件使用的编码,使用的Servlet程序的公式等,这些信息可以在xml文件中使用多个<init-param>元素进行配置,或者在@webservlet()注解中配置。当初始化一个Servlet时,会将其配置信息封装到一个ServletConfig对象中,通过调用init(ServletConfig cofig)方法讲ServletConfig对象传给Servelt。
常用方法有:
①用xml文件配置:
②注解配置:
③使用:
结果:
7、ServletContext接口:在Servlet启动的时候,会为每一个web应用创建一个唯一的ServletContext对象代表当前web应用。不仅封装了当前web应用的所有信息,还实现了多个Servlet之间的数据共享。
①在xml配置(实现封装了信息):
获取:
②注解配置:
在另一个servlet中获取(实现数据共享):
三、servlet的请求和响应
1、关于请求和响应的格式如下:
2、HttpServletResponse对象:在Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse,专门来封装HTTP响应的信息。定义了两个状态码的方法:
①setStatus(int status)方法。用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态描述信息与状态码相关,而http版本由服务器确定,因此只要通过setStatus(int status)方法设置了状态码,可以实现状态码的发送。
正常情况下,Web服务器会默认产生一个状态码为200的状态行。
②sendError(int sc)方法。用于发送表示错误信息的状态码。在response对象中,提供了两个重载的方法,具体如下:
public void sendError(int code):只是发送错误信息的状态码
public void sendError(int code, String message):第二个方法除了发送状态码外还可以增加一条用于提示说明的文本信息,该文本信息将出现在发送给客户端的正文内容中。
常见的状态:
③发送响应消息体的相关方法:
第一个是getOutputStream()方法,这是输出二进制格式的响应体。
第二个是getWriter()方法,输出流对象为PrintWriter型,可以直接输出内容全为字符文本的网页文档。
例子:
注意:如果有乱码情况:
解决方法一:浏览器点击【查看】-【编码】-【utf-8】
解决方法二:加一个response.setContentType("text/html;charset=utf-8");
3、HttpServletRequset对象:当访问Servlet时,会在请求信息的请求行中,包含请求方法、请求资源名、请求路径等信息,为了获取这些信息,在HttpServletRequest接口中定义了一系列获取
①请求行信息的方法:
②请求头的相关方法:
③获取请求消息体定义了两个输入流的相关方法:
第一个是getInputStream():是获取表示实体内容的ServletInputStream对象。
第二个是getReader():用于获取表示实体内容的BufferedReader对象,对象会将实体内容中的字节数据按照请求消息中定义的字符集编码转换成文本字符串。
④获取请求参数的方法:
一般要获取用户在表单写的内容,request.getParameter(String name),其中name写的就是表单中name对应的名字。
注意:请求参数乱码问题
第一种解决方法:post的话加requset.setCharacterEncoding("utf-8");
第二种解决方法:get的话加
String name=request.getParameter(“username”);
name=new String(name.getBytes("iso8859-1"),"gbk");
四、请求重定向、请求转发、请求包含
1、请求重定向:指的是web服务器接受到客户端的请求之后,可能由于某些条件限制,不能访问当前请求url所指向的web资源,而是指定了一个新的资源路径,让客户端重新发送请求。HttpServletResponse接口中,定义了一个sendRedirect()方法,该方法用于生成302响应码和Location响应头,从而通知客户端重新访问Location响应头中指定的URL。
注意:地址栏会改变,重定向过程中request域的值会丢失。
2、请求转发:RequestDispatcher实现的是请求转发,请求转发的意思是通知其他web资源处理当前Servlet的请求,RequestDispatcher对象由Serlet容器创建,该对象用于接受客户端的请求并将请求发送给服务器上的任意资源、对于RequestDispatcher对象来说,web资源是可见的,可以直接请求转发到任意资源。
注意:地址栏不会改变,转发过程中request域的值不会丢失。
①ServletRequest接口中定义了两个获取RequestDispatcher对象的方法,具体如下:getRequestDispatcher(String path):用于返回封装了某个路径所指定资源的RequestDispatcher对象。
getNamedDispatcher(String name):用于返回封装了某个Web资源的RequestDispatcher对象,传递给该方法的参数是在Web应用程序部署好的某个Web资源名称。
②获取到RequestDispatcher对象后,最重要的工作就是通知其它Web资源处理当前的Servlet请求,在RequestDispatcher接口中,定义了两个相关方法,具体如下:
①forward(ServletRequest request,ServletResponse response):用于将请求从一个Servlet传递给另外的一个Web资源。
②include(ServletRequest request,ServletResponse response):用于将其它的资源作为当前响应内容包含进来。
3、请求包含:指的是使用include()方法将Servlet请求转发给其他web资源进行处理。与请求转发不同的是,在请求包含返回的响应消息中,既包含了当前Servlet的响应消息,也包含了其他Web的资源所作出的响应消息。