评论

收藏

【WebServerProgramming】Ch.4 Servlet

网络安全 网络安全 发布于:2021-07-13 17:35 | 阅读数:592 | 评论:0

  Servlet是以Java平台以编译为基础的网页应用开发的核心技术。JSP是基于Servlet的网络编程技术,内部JSP是转换成Servlet后实行的。因此,为了更好地理解JSP,开发高级网络程序,需要对Servlet的理解。
Servlet概要  Servlet是处理客户端请求的小型Java类,服务器内的所有Java类并不都是Servlet。
优点:
➊ 因为是Java为基础的,JAVA的所有API都可以使用。
➋因为不会受到操作系统或硬件的影响,所以只开发一次的应用在多种服务器环境中运行是可能的
➌网络应用提供有效的资料共享方法。
➍可以利用多种开放源代码和开发工具。
  Web开发中的Servlet:
➊ 可以轻松适用MVC模式,也可以实现容器与密切相关相关的服务器程序。
➋适用MVC模式时可分离内容和商务logic,控制器和view分担作用,使网页设计师和开发者之间工作顺畅。
➌通过ristner和过滤器 servlet等高级程序设计出更有效的网页应用。
最近,弹簧和冲浪等开放源代码框架技术备受关注,而且这些框架技术的很多部分都在内部使用Servlet技术,因此,Servlet称为开发基于框架的网页应用的重要工具之一
  容器(container):是开发JSP或Servlet并运行的环境。Apache Tomcat就是典例。
区分web服务器Servlet 容器目的提供web访问的基本软件运行Servlet的基本软件处理内容H5,CSS,JS,Image等Servlet类运行方式根据URL从硬盘中读取内容根据Servlet情况处理。如果没有对应的实例,则创建;如果有,则连接该实例并运行,运行后返还结果JSP运行Web服务器中无法处理,需要到Servlet容器中处理JSP自身可以处理特征能提供多种服务,服务运营时可以单独使用能够提供基本 的Web服务,但是高级设定少且性能差,需要与WEB服务器结合使用
Servlet过程

  • 开发者编写对应的java程序。
  • 将该程序编译生成java类文件(.class)
  • 将Java类登录到Servlet容器中。有两种方法,可以将对应的类通过手动导入容器,也可以在编写程序时追加URL等信息,当容器启动时会读取类文件,自动登录到容器。
  • 就绪后。客户端发起请求,第一个请求到达时,容器会创建对应的实例,然后该实例会进行一定的运算/处理并响应请求。第二个请求以后,因为实例已经创建,可以直接提供服务,不需要新建对象。
  • 服务过程中允许实例调用其他应用程序资源或系统资源(数据库)
  Servlet不像一般的APP,开始时点击启动,运行结束后就终止,它拥有生命周期。当生成Servlet实例时,构造函数运行。init()初始化方法是只会执行一次的方法,然后根据客户端请求执行具体服务。当程序结束或者web服务器关闭时,会呼出destroy函数。结束生命周期。
  Servlet因为基于容器运行,因此开发者不能随意的开发,需要继承特定的java类来实现。由于需要继承其他程序,就需要理解API。一般而言,是从 java.servlet.HttpServlet继承。
DSC0000.png


方法
  Get:从服务器带到客户端的方法。如HTML的图片等。
·服务器最多可以传送240Byte的数据。
· QUERY_STRING环境变量传导至服务器,遵循以下形式。
– http://www.xxx.com/servlet/login?id=hj&name=hong
· "?“之后的值会在服务器中通过QUERY_STRING传达。 应以"属性=值"的形式使用,”&"是传达各种属性值时连接的文字序列。
· 因为URL会暴露在外面,所以安全方面可能会出问题
·HTTP消息里,有Head和Body两部分。而Get没有Body部分,Post二者都有。一般Head中搭载着多种多样的方法,HMTL文件通过HTML消息传递,而HTML文件又有Head和Body部分,但是HTML文件整体被包含在HTML消息的Body中。而消息的Head中包含首部,校验等认证信息。
  POST
·为了将信息上传到服务器使用的命令。没有数据上传限制。不会在URL中表现出参数。
  inint():只会被调用一次的初始化方法。会在团队作业中使用。
service():根据客户端请求与自己的服务类型,通过这个方法调用doGet或者doPost(),通过参数HttpServletRequest和HttpServletResponse处理用户要求。
destroy():当从容器内部有结束请求时调用。与init一样只会运行一次。
HelloWorld
package jspbook.ch04;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/* Servlet注释部分:urlPatterns为了运行该程序的URL。
从javax.servlet.http.HttpServlet继承后得到,构成生命周期*/
@WebServlet(description = "第一个Servlet程序", urlPatterns = { "/HelloWorldServlet" })
public class HelloWorldServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
  /**
   * 기본 생성자
   */
  public HelloWorldServlet() {
  }
/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
 //HttpServletRequest类型的变量:承载从客户端传来的请求信息
 //HttpServletResponse类型的变量:将服务器的信息传输给客户端的数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 指定传输过程中传输数据的类型:HTML文件,UTF8编码
response.setContentType("text/html;charset=UTF-8");
// 为了输出到浏览器,使用PrintWirter方法
PrintWriter out = response.getWriter();
// HTML内容:简单的内容,复杂的过程
out.println("<HTML>");
out.println("<HEAD><TITLE>Hello World Servlet</TITLE></HEAD>");
out.println("<BODY><H2>Hello World Servlet : 헬로월드</H2></BODY>");
out.println("</HTML>");
}
/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Post에서 별다른 처리 없이 doGet으로 포워딩
doGet(request, response);
}
}
  编译环境:
DSC0001.png
直接编译会报错。这种情况是因为对于javax包,java本体并没有这个库。需要额外添加扩充。
基本命令:javac -d . -encoding UTF-8 HelloWorldServlet.java
扩充命令:javac -d . -encoding -classpath <路径名> servlet-api.jar UTF-8 HelloWorldServlet.java
DSC0002.png
由于Tomcat的库中有Servlet的API,所以直接设置这个环境变量即可。按照上述方法就能够编译了,但是只编译一次还好,如果对多个java类编译每次都要输入这一条很长的命令,而且输错一个字符也要重打,很麻烦。么有更好地办法吗?
==>环境变量
DSC0003.png
在这新建一项新的CLASSPATH选项,然后追加对应的jar包。(如果已经有classpath则不需要新建直接编辑)
DSC0004.png
DSC0005.png
  在环境变量中追加常用的jar包。然后编译即可。(注意如果CMD窗口先打开后设置环境变量,需要重启后才能生效)
DSC0006.png
如此便没有错误了。
DSC0007.png
然后将编译生成的文件追加到之前创建的WEB-INF\classes文件夹下。就可以运行了
DSC0008.png
运行结果如上图所示。

CMD乱码问题
DSC0009.png

  在tomcat的bin文件夹下,找到如图所示的文件,并在setloacl下追加chcp 65001(意味着UTF-8编码格式)
DSC00010.png
然后再打开startup.bat本身的编码
DSC00011.png
如果原来图中标识的区域是start,则改为run。
然后cmd命令窗口启动tomcat乱码就解决了。
DSC00012.png


  
关注下面的标签,发现更多相似文章