Servlet+jsp复习
Servlet
Servlet是Java EE十三项规范之一,是一个接口。javaweb的三大组件为Servlet、Filter、Listener。
Servlet是一个运行在web服务器的java程序,可以用来接收客户端发来的数据和响应回传数据给客户端。
通过查询API文档可以得知,Servlet接口中有以下五个抽象方法
init()方法是在工程创建的时候调用的,请求和响应都在Service(req,res)方法中处理。关闭服务器的时候调用destroy方法。其他两个不常用就不介绍了。
当我们启动Tomcat服务器的时候,可以通过两种方式来访问Servlet程序
第一种方式:早期是把Servlet程序的一个信息写在web.xml文件中来访问,具体写法如下:
为了简化 Servlet 的配置,Servlet 3.0 中增加了注解支持,例如:@WebServlet、@WebInitParm 、@WebFilter 和 @WebLitener 等,这使得 web.xml 从 Servlet 3.0 开始不再是必选项了。下面我们对 @WebServlet 进行介绍。
第二种方式:使用注解来实现
其次再来介绍以下Servlet的继承体系,GenericServlet这个类实现了Servlet接口,做了很多空实现,并不能满足我们的需求,我们建立的web工程遵守Http协议,接着HttpServlet类继承了
GenericServlet类,对service()方法进行了实现,并对Get和Post请求进行了分发处理。
深入浅出,我们要想使用Servlet,就只需要创建一个类继承HttpServlet类,并且重新doGet和doPost方法即可。
细心可以发现,在init方法中有一个形参,是ServletConfig的实现接口类型的(ServletConfig是一个标准化接口),这个类是Servlet程序的配置信息类,
可以获取初始化参数、别名和ServletContext对象 注:Servlet程序的默认第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig对象(一个servlet类对应一个ServletConfig对象)
接着,ServletContext类,首先来进行介绍
1、ServletContext 是一个接口,它表示 Servlet 上下文对象 2、一个 web 工程,只有一个 ServletContext 对象实例。
3、ServletContext 对象是一个域对象。 4、ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。
ServletContext类的四个作用:
1、获取 web.xml 中配置的上下文参数 context-param 2、获取当前的工程路径,格式: /工程路径 3、获取工程部署后在服务器硬盘上的绝对路径 4、像 Map 一样存取数据
运行结果如下:
第一行是空行是因为我的Tomcat路径设置的问题,放下面了
接下来是Get和Post请求在Http协议中的不同点 get请求分为请求行和请求头,没有请求体。post请求分为请求行、请求头和请求体
get请求:
请求行:
1) 请求的方式 GET (2) 请求的资源路径[+?+请求参数] (3) 请求的协议的版本号 HTTP/1.1
请求头:存放键值对信息
post请求的get请求的区别就在于,把请求参数放到了请求体中。
关于响应行的请求形式如下:
1、响应行 (1) 响应的协议和版本号 (2) 响应状态码 (3) 响应状态描述符 2、响应头 (1) key : value 不同的响应头,有其不同含义 空行 3、响应体 ---->>> 就是回传给客户端的数据
响应状态码:200 表示请求成功 302 表示请求重定向 404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误) 500 表示服务器已经收到请求,但是服务器内部错误(代码错误)
请求转发:RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2"); requestDispatcher.forward(req,resp);转发只能在自己的工程范围内进行,不能访问外面的网站,比如百度、b站。转发是一次请求,request域还可以用,浏览器栏的地址不会改变
请求重定向:1、resp.setStatus(302); // 设置响应头,说明 新的地址在哪里 resp.setHeader("Location", "http://localhost:8080");
2、resp.sendRedirect("http://localhost:8080"),重定向是两次请求,地址改变了,相当于重新输入一遍新地址再访问。
dopost响应乱码解决方法:
resp.setContentType("text/html; charset=UTF-8");
HttpServletresponce类的使用:
PrintWriter writer = resp.getWriter(); writer.write("response's content!!!");
获取标准输出流
PrintWriter out = resp.getWriter();
向标准输出流中写入数据,那么客户端浏览器就会直接看到这写数据
out.write()是字节输出流的方法
输出数字,显示的是其ASCII对应字符
out.write(97); 输出a
out.print()是字符输出流的方法
out.print(97); 输出97
一、区别
1. print方法是子类JspWriter,write是Writer类中定义的方法;
2. 重载的print方法可将各种类型的数据转换成字符串的形式输出,而重载的write方法只能输出字符、
字符数组和字符串等与字符相关的数据;
3. JspWriter类型的out对象使用print方法和write方法都可以输出字符串,但是,如果字符串对象的值
为null时,print方法将输出内容为“null”的字符串,而write方法则是抛出NullPointerException异常
但是print()方法的底层实现也是write()只不过把所有类型都转成了String类型。