Servlet总结

Servlet整理

响应体以流的形式,向客户端做出响应,里面包括数据。其实请求转发和重定向都是以字符流的形式,向浏览器返回的是一个contentType为text/html页面类型格式的数据,其实还有其他的格式的数据,让浏览器进行解析(json数组,图片,只是文本)
Jsp本身就是一个servlet,属于表示层,我们请求转发到一个JSP里面,其实内部是有内置对象request和response的,response可以对浏览器做出响应。
Jsp会对浏览器做出响应的。
我们访问一个jsp,其实也是一个请求,然后jsp容器内置对象response对浏览器做出了响应。
在这里插入图片描述

Jsp其实就是把html和得到的动态数据拼接好,tomcat等服务器输出流对象最终还是通过流的方式给浏览器生成响应信息。
在这里插入图片描述

请求与响应:
请求包括:请求行,请求头,情头行。
请求行包括:请求方式+请求协议+端口号+请求地址+参数列表+协议版本
请求头包括:浏览器可以接受服务器响应的数据类型,以Keyvalue的形式存在
请求体包括:get请求里面请求体的内容为空,post请求里面是有数据的

响应包括:响应行,响应头,响应体
响应行包括 HTTP协议版本+状态码
状态码常用的有:200响应成功,302表示重定向的,304表示从缓存中拿的数据,404表示请求路径错误,
表示的时资源不存在,或者删除,403Forbidden.服务器已经理解请求,但是拒绝执行它500表示服务器内部错误。
响应头;响应头也是用的键值对keyvalue,服务器基于响应头通知浏览器的行为。
表示告诉浏览器返回的数据的各种信息(比如:响应数据的长度,响应数据的类型就是告诉浏览器怎么解析数据,响应的时间)
响应体:就是服务器响应的数据。需要被浏览器进行解析

响应头设置响应的数据类型:response.setContentType(texthtml;charset=utf-8)浏览器必须以HTML页面解析返回数据
response.setContentType(textplain;charset=utf-8)浏览器以文本进行解析数据
response.setContentType(applicationjson;charset=utf-8)post请求,然后要求浏览器以json字符串进行解析

【常见响应头】
方法 说明
setHeader(String name,String value) 设置响应头信息

给浏览器设置响应头:Content-Disposition   告诉浏览器以附件的形式打开这个文件
response.setHeader(Content-Disposition,attachment;filename=+fileName);

响应头Key 响应头value
refresh 页面刷新,例如:3;url=www.itcast.cn 三秒刷新页面到www.itcast.cn
content-type 设置响应数据的类型(MIME类型)和编码格式 例如:texthtml;charset=UTF-8
location 指定响应的路径,需要与状态码302配合使用,完成重定向。
content-disposition 通过浏览器以附件形式解析正文,例如:attachment;filename=xx.zip。

响应体以流的形式,向客户端做出响应,里面包括数据。
【响应体】
方法 说明
ServletOutputStream getOutputStream() 用于向浏览器输出二进制数据。【字节流–文件下载】
java.io.PrintWriter getWriter() 用于向浏览器输出字符数据。【字符流–给浏览器响应数据】

response.getOutputStream.write(arr,0,len);
response.getWriter().write(str);

servlet 其实是运行在tomcat上的一个程序,用来处理请求和响应,
tomcat其实就是一个容器,里面放着servlet

在浏览器上可以进行访问这个servlet实现类.servlet是个接口。
我们可以把servlet配置到tomcat里面,让tomcat知道有这个东西,然后我们在浏览器
上就可以找到这个类了,然后执行里面的方法,在web.xml里面进行配置映射。
可以在控制台打印出来我们在service里面重写的内容。

我们执行方法要执行service()方法,然后service方法里面会根据请求的方法去调用
doget()或者dopost()方法等,我们只需要重写针对的方法就可以了。
servlet 其实是单例多线程的
1当web服务器启动的时候,或者客户端发送请求到服务端的时候,servlet就被加载并实例化
一个对象,2容器初始化,初始化线程池的的线程数目,通过web.xml 初始化线程池参数,
3.当请求到达时,servlet容器通过调度线程,调度他管理下的线程
在servlet的配置当中,load-on-startup1load-on-startup的含义是:标记容器是否在启动的时候就加载这个servlet。当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;
当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。正数的值越小,启动该servlet的优先级越高。

如果我们在web.xml中设置了多个servlet的时候,可以使用load-on-startup来指定servlet的加载顺序,服务器会根据load-on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,服务器会自己决定初始化顺序。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

   这个对象的作用就是获得在配置servlet的一些配置信息
    ServletConfig config = getServletConfig();
    得到配置文件中的定义的servlet的名字
    String servletName = config.getServletName();

    System.out.println(servletName);
    String address = config.getInitParameter(address);
    System.out.println(地址的属性值为+address);

    得到所有的的属性的名字
    EnumerationString initParameterNames = config.getInitParameterNames();
    遍历所有的名字
    while (initParameterNames.hasMoreElements()){
        String s = initParameterNames.nextElement();
        根据属性的名字得到对象的值
        String initParameter = config.getInitParameter(s);
        System.out.println(initParameter);
    }
}

用ServletConfig这个对象的作用就是为了给你们传递数据,我们可以在servlet的
配置文件web.xml中赋初始值,然后这个对象就可以得到我们的值,就可以在方法
中进行使用了。

要求:配置servlet
访问servlet 通过浏览器的访问来访问service方法
servlet的生命周期

servletContxt的作用:
在一个web项目中只能存在一个servletContext对象
1.获取web.xml里面的全局的配置参数。
2.可以获取web应用的资源。
获取文件名 和 文件路径
String filename = request.getParameter(filename);
String path = getServletContext().getRealPath(WEB-INF + filename);
3.存取数据,servlet之间共享。

request包含form表单请求的信息
response 响应数据给浏览器

打印到浏览器上信息。
int count = (int) getServletContext().getAttribute(count);
response.getWriter().write(你是我们第+count+位登录的人);

ServletContext的生命周期:
一个项目就一个ServletContext对象,在所有的servlet都可以使用。
setAttribute()和getAttribute()方法
项目从服务器上启动的时候会创建一个ServletContext对象,直到项目从服务器上移除,或者关掉服务器。

处理get请求乱码的问题:
获取中文数据

客户端提交数据给服务器端,如果数据中带有中文的话,有可能会出现乱码情况,那么可以参照以下方法解决。

如果是GET方式

  1. 代码转码
    String username = request.getParameter(username);
    String password = request.getParameter(password);

System.out.println(userName=+username+==password=+password);

get请求过来的数据,在url地址栏上就已经经过编码了,所以我们取到的就是乱码,
tomcat收到了这批数据,getParameter 默认使用ISO-8859-1去解码

先让文字回到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串
username = new String(username.getBytes(ISO-8859-1) , UTF-8);
System.out.println(userName=+username+==password=+password);
直接在tomcat里面做配置,以后get请求过来的数据永远都是用UTF-8编码。
2. 可以在tomcat里面做设置处理 confserver.xml 加上URIEncoding=utf-8
Connector connectionTimeout=20000 port=8080 protocol=HTTP1.1 redirectPort=8443 URIEncoding=UTF-8

如果是POST方式
这个说的是设置请求体里面的文字编码。 get方式,用这行,有用吗? — 没用
request.setCharacterEncoding(UTF-8);
这行设置一定要写在getParameter之前。

响应的数据中有中文,那么有可能出现中文乱码

以字符流输出
response.getWriter()
1. 指定输出到客户端的时候,这些文字使用UTF-8编码
response.setCharacterEncoding(UTF-8);

	2. 直接规定浏览器看这份数据的时候,使用什么编码来看。
	response.setHeader(Content-Type, texthtml; charset=UTF-8);
	
	response.getWriter().write(我爱黑马训练营...);

以字节流输出
response.getOutputStream()

	1. 指定浏览器看这份数据使用的码表
	response.setHeader(Content-Type, texthtml;charset=UTF-8);
	
	2. 指定输出的中文用的码表
	response.getOutputStream().write(我爱深圳黑马训练营...getBytes(UTF-8));


	--------------------------------------------

###不管是字节流还是字符流,直接使用一行代码就可以了。

这句话是让自己下面的代码写是utf-8格式的,也让浏览器进行查看也是utf-8格式的文本。
response.setContentType(texthtml;charset=UTF-8);

然后在写数据即可。

web.xml文件可以设置首页
重定向写法: 重新定位方向 参数即跳转的位置可以跳转到jsp里面,也可以跳转到一个servlet,可以携带参数信息。两次请求,两次响应,先请求,返回一个地址,然后再向服务端发送请求。
response.sendRedirect(地址上显示的是最后的那个资源的路径地址);
1. 地址上显示的是最后的那个资源的路径地址
2. 请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址, 浏览器在根据这个地址,执行第二次访问。
3. 可以跳转到任意路径。 不是自己的工程也可以跳。
4. 效率稍微低一点, 执行两次请求。
5. 后续的请求,没法使用上一次的request存储的数据,或者 没法使用上一次的request对象,因为这是两次不同的请求。
请求转发的写法: 参数即跳转的位置,一次请求,然后服务端可以把这次请求转发到下个sevlet上,然后对数据进行处理,并作出响应。
request.getRequestDispatcher(只能跳转自己项目的资源路径).forward(request, response);

  1. 地址上显示的是请求servlet的地址。 返回200 ok
  2. 请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作。
  3. 只能跳转自己项目的资源路径 。
  4. 效率上稍微高一点,因为只执行一次请求。
  5. 可以使用上一次的request对象。
    在这里插入图片描述
    在这里插入图片描述

“语法糖”是指使用更加方便,但是原理不变的代码语法。例如在遍历集合时使用的for-each语法,其实 底层的实现原理仍然是迭代器,这便是“语法糖”。从应用层面来讲,Java中的Lambda可以被当做是匿名内部 类的“语法糖”,但是二者在原理上是不同的。

父类没有异常,子类必须没有异常。
如果子类出现了异常,那么必须在父类中抛出异常。

84076@sh.itcast.cn

关于抽取servlet的方式:
关于servlet 一次请求就必须对应一个servlet的问题
请求servlet的流程是先到servlet里面的init()方法,然后调用service()方法,判断是什么请求,去调用对应的方法
我们可以在客户端发送请求的时候传递过来一个需要调用的方法名,创建一个工具类,让它继承httpservlet,然后重写里面的service()方法,用反射的方式在里面去判断传递过来的方法名是否存在,存在的话直接调用,然后响应到指定的界面。就可以在servlet实现类中写很多具体的方法,就不用一个个的写servlet了。

文件下载:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Servlet 是 Java 技术中的一个组件,用于在 Web 应用程序中处理 HTTP 请求和响应。 Servlet 是一个 Java 类,它可以接收来自客户端的 HTTP 请求,并生成 HTTP 响应。Servlet 运行在 Web 服务器上,并通过一种称为 Servlet 容器的软件来管理它们的生命周期。 在 Java Servlet API 中,有两个核心类:javax.servlet.Servlet 和 javax.servlet.http.HttpServletServlet 类是所有 Servlet 的父类,而 HttpServlet 是处理 HTTP 请求和响应的 Servlet 的基类。 Servlet 具有以下优点: 1. 可以处理多种类型的请求和响应,包括文本、HTML、XML 等。 2. 可以处理多个并发请求。 3. 可以动态生成响应。 4. 可以在运行期间动态加载和卸载。 在 Java 中,开发 Servlet 需要使用 Servlet API 和一个 Servlet 容器,如 Tomcat 或 Jetty。Servlet API 中提供了一些接口和类,用于实现 Servlet。开发 Servlet 需要实现 Servlet 接口或继承 HttpServlet 类,并覆盖一些方法来处理请求和生成响应。然后将 Servlet 部署到 Servlet 容器中,容器会负责管理 Servlet 的生命周期,并将请求路由到正确的 Servlet 中。 ### 回答2: Servlet是一种运行在服务器上的Java程序,主要用于处理客户端的HTTP请求和响应。它是Java EE平台的一部分,广泛用于开发Web应用程序。 Servlet通过定义自己的类,实现javax.servlet.Servlet接口来创建。它可以被容器(如Tomcat和Jetty)动态加载和执行。当客户端发送HTTP请求时,容器将会实例化一个Servlet对象,并调用其相应的方法来处理请求。 Servlet能够处理多种HTTP请求方法,例如GET和POST。它可以接收来自客户端的请求参数,并根据业务逻辑生成响应。Servlet通常用于处理表单提交、用户认证、数据查询及处理等功能。 Servlet具有以下特点: 1. 可复用性:开发人员可以编写可复用的Servlet组件,以实现不同的业务功能。 2. 轻量级:Servlet是基于Java语言开发的,运行速度快,资源消耗低。 3. 并发处理:Servlet容器能够同时处理多个客户端请求,并通过多线程机制来实现并发处理。 4. 可扩展性:Servlet可以通过扩展其他Java类和接口来增强功能,例如使用过滤器(Filter)来对请求和响应进行处理。 Servlet的生命周期包括三个阶段:初始化、请求处理和销毁。 1. 初始化阶段:Servlet容器实例化Servlet对象,并调用其init()方法来进行初始化操作。开发人员可以在该方法中进行一些配置和初始化工作。 2. 请求处理阶段:当有客户端请求到达时,Servlet容器将会创建一个线程来处理该请求。容器会调用Servlet的service()方法,并传递请求和响应对象给它。在service()方法中,开发人员可以编写具体的业务逻辑来处理请求,并生成相应的响应。 3. 销毁阶段:当服务器关闭或应用程序被卸载时,Servlet容器会调用Servlet的destroy()方法来进行资源释放和清理操作。 总结来说,Servlet是一种用于处理Web请求和响应的Java程序,它具有可复用性、轻量级、并发处理和可扩展性等特点。开发人员通过实现Servlet接口,编写具体的业务逻辑来处理请求,并且可以通过生命周期方法进行初始化和销毁操作。 ### 回答3: Servlet是一种用Java编写的服务器端程序,用于处理HTTP请求和响应。它是Java EE(Enterprise Edition)的规范之一,提供了一种开发动态网页的方式。 Servlet可以通过HTTP协议接收来自客户端的请求,并且可以根据请求的内容生成相应的HTML、XML或其他格式的响应数据。它可以被部署到Web服务器中,然后根据请求的URL地址,调用相应的Servlet进行处理。 Servlet运行在Web服务器的Servlet容器中,如Apache Tomcat。当客户端发起一个HTTP请求时,Servlet容器会将请求交给对应的Servlet进行处理。Servlet可以根据请求的内容动态生成响应页面,并将响应发送回客户端。 使用Java编写Servlet可以享受到Java语言的众多优势,如面向对象、平台无关性和强大的开发工具支持。通过编写Java Servlet程序,可以处理用户输入、访问数据库、调用其他Java类库等,功能非常灵活且强大。 Servlet的生命周期包括初始化、处理请求和销毁三个阶段。在初始化阶段,Servlet容器会调用Servlet的init()方法来进行一些初始化操作。在处理请求阶段,Servlet容器会调用Servlet的service()方法来处理具体的请求。在销毁阶段,Servlet容器会调用Servlet的destroy()方法来释放资源。 总之,Servlet是一种用Java编写的服务器端程序,用于处理客户端发起的HTTP请求并生成相应的响应。它是Java EE的一部分,提供了一种灵活和强大的方式来开发动态网页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值