Web全栈~36.Servlet

Web全栈~36.Servlet

上一期

Tomcat

JDK和Tomcat安装和配置

点击这里

Tomcat 目录结构与介绍

bin

       bin 目录主要是用来存放 tomcat 的命令文件,主要有两大类,一类是以.sh 结尾的(linux 命令),另一类是以.bat 结尾的(windows 命令)。

conf

       conf 目录主要是用来存放 tomcat 的一些配置文件。

lib

       lib 目录主要用来存放 tomcat 运行需要加载的 jar 包。

logs

       logs 目录用来存放 tomcat 在运行过程中产生的日志文件。

temp

       temp 目录用户存放 tomcat 在运行过程中产生的临时文件。(清空不会对 tomcat 运行带来影响)

webapps

       webapps 目录用来存放应用程序,当 tomcat 启动时会去加载 webapps 目录下的应用程序。可以以文件夹、war 包的形式发布应用。

work

       work 目录用来存放 tomcat 在运行时的编译后文件,例如 JSP 编译后的文件。

Tomcat 配置文件介绍

       Tomcat 的配置文件由 4 个 xml 组成, 分别是 context.xml、web.xml、server.xml、tomcat-users.xml。每个文件都有自己的功能与配置方法。

       Context.xml 是 Tomcat 公用的环境配置。 Tomcat 服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器 。

       web.xml是Web 应用程序描述文件,都是关于是 Web 应用程序的配置文件。所有 Web 应用的web.xml 文件的父文件。

       server.xml是 tomcat 服务器的核心配置文件,server.xml 的每一个元素都对应了 tomcat 中的一个组件,通过对 xml 中元素的配置,实现对 tomcat 中的各个组件和端口的配置。

       tomcat-users.xml配置访问 Tomcat 的用户以及角色的配置文件。

Servlet

web.xml配置信息
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <!--      接口名称       -->
        <servlet-name>test</servlet-name>
        <!--         接口位置           -->
        <servlet-class>com.alvin.controller.TestController</servlet-class>
    </servlet>

    <servlet-mapping>
        <!--       映射进来         -->
        <servlet-name>test</servlet-name>
        <!--        接口        -->
        <url-pattern>/SOS</url-pattern>
    </servlet-mapping>
</web-app>

Servlet接口

在这里插入图片描述

Servlet生命周期

init():初始化
service():服务
destroy():销毁

Servlet 处理请求的原理

       当浏览器基于 get 方式请求我们创建 Servlet 时,我们自定义的 Servlet 中的 doGet 方法会被执行。doGet 方法能够被执行并处理 get 请求的原因是,容器在启动时会解析 web 工程中 WEB-INF 目录中的 web.xml 文件,在该文件中我们配置了 Servlet 与 URI 的绑定,容器通过对请求的解析可以获取请求资源的 URI,然后找到与该 URI 绑定的 Servlet 并做实例化处理(注意:只实例化一次,如果在缓存中能够找到这个 Servlet 就不会再做次实例化处理)。在实例化时会使用 Servlet 接口类型作为引用类型的定义,并调用一次 init 方法,由于 HttpServlet 中重写了该方法所以最终执行的是HttpServlet 中init 方法(HttpServlet 中的Init 方法是一个空的方法体),然后在新的线程中调用 service 方法。由于在 HttpServlet 中重写了 Service 方法所以最终执行的是 HttpServlet 中的 service 方法。在 service 方法中通过 request.getMethod() 获取到请求方式进行判断如果是 Get 方式请求就执行 doGet 方法,如果是 POST 请求就执行doPost 方法。如果是基于 GET 方式提交的, 并且在我们自定义的 Servlet 中又重写了HttpServlet 中的doGet 方法,那么最终会根据 Java 的多态特性转而执行我们自定义的 Servlet 中的 doGet 方法。

GET 和POST 的区别

       GET 在浏览器回退时是无害的,而 POST 会再次提交请求。

       GET 产生的 URL 地址可以被 Bookmark,而 POST 不可以。

       GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。

       GET 请求只能进行 url 编码,而 POST 支持多种编码方式。

       GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。

       GET 请求在 URL 中传送的参数是有长度限制的,而 POST 则没有。对参数的数据类型 GET只接受 ASCII 字符,而 POST 即可是字符也可是字节。

       GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。

       GET 参数通过 URL 传递,POST 放在 Request body 中。

request和response

       request是请求,response是响应

       当用户在浏览器输入 URL http://www.baidu.com 的时候,浏览器发送一个 Request 去获取 http://www.baidu.com 的 html. 服务器把 Response 发送回给浏览器。浏览器分析 Response 中的 HTML,发现其中引用了很多其他文件,比如图片,CSS 文件, JS 文件。浏览器会自动再次发送 Request 去获取图片,CSS 文件,或者 JS 文件。等所有的文件都下载成功后。 网页就被显示出来了。

代码示例

需求

       后端使用request接收表单发过来的账号密码,然后再用response通过JSON,把结果还给前端

大话Ajax
前端
  <script type="text/javascript">
      function but() {
         var username = document.getElementById("username").value;
         var password = document.getElementById("password").value;
         var xhr = new XMLHttpRequest();
         xhr.open("get","/SOS?username=" + username + "&password=" + password);
         xhr.send();
         xhr.onreadystatechange = function () {
            var parse = JSON.parse(xhr.responseText);
            alert(parse);
         }
      }
  </script>
后端处理
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用request接收
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //判断是否登陆成功
        String result = "";
        if(username.equals("369613719") && password.equals("123456")){
            result = "succeed";
        }else{
            result = "error";
        }
        //使用Jackson的APL将User对象转化为JSON格式的字符串对象
        ObjectMapper objectMapper = new ObjectMapper();
        //将User对象转换为JSON格式对象
        String json = objectMapper.writeValueAsString(result);
        //设置相应类型为application/json
        response.setContentType("application/json");
        PrintWriter writer = response.getWriter();
        writer.println(json);
        writer.flush();
        writer.close();
    }

设置响应编码

response.setCharacterEncoding("utf-8");

       设置服务端为浏览器产生响应的响应编码,服务端会根据此编码将响应内容的字符转换为字节。

response.setContentType("text/html;charset=utf-8");

       设置服务端为浏览器产生响应的响应编码,服务端会根据此编码将响应内容的字符转换 为字节。同时客户端浏览器会根据此编码方式显示响应内容。

转发和重定向

       转发:在服务器端跳转,将同一个request进行传递,只有一个请求。

       重定向:客户端根据服务器端返回的地址发送新的请求。

区别

       转发效率比重定向效率相对要高

       转发源组件和目标源组件共享同一个request数据。重定向源组件和目标组件不共享同一个request数据(可以使用session共享)

       转发后浏览器的URL地址不变,但是重定向后浏览器的URL地址则会是重定向之后的地址

       转发不经过过滤器,重定向会经过过滤器。而且转发会导致表单的重复提交,重定向则不会。

       SpringMVC跳转页面的时候是默认的转发,如果要使用重定向则需要特别声明。

文件下载

在实现文件下载时,我们需要修改响应头,添加附加信息

       response.setHeader("Content-Disposition", "attachment; filename="+文件名);

代码示例
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        File file = new File("C:/Users/86157/Desktop/myPicture/a.jpg");
        InputStream inputStream = new FileInputStream(file);
        byte[]buf = new byte[inputStream.available()];
        inputStream.read(buf);
        //在相应当中添加附加信息
        response.setHeader("Content-Disposition","attachment; filename="+file.getName());
        OutputStream outputStream = response.getOutputStream();
        outputStream.write(buf);
        outputStream.flush();
        outputStream.close();
    }
  • 26
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值