开发者社区> Lux_Sun> 正文

Servlet - 基础篇

简介: Servlet - 基础篇
+关注继续查看

1.JSP与Servlet的不同

a、JSP在本质上就是SERVLET,但JSP是Servlet的一种简化,JSP由HTML代码和JSP标签构成,可以方便地编写动态网页。

b、Servlet完全是由JAVA程序代码构成流程控制和事务处理。

c、Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。JSP侧重于视图,Servlet主要用于控制逻辑。

2.Servlet 简介

 - Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器。

 - 用Java编写的服务器端程序。

 - 主要功能在于交互式地浏览和修改数据,生成动态Web内容。

3.Servlet 路径问题

<%
    String basePath = request.getScheme()+":"+"//"+request.getServerName()+":"+request.getServerPort()+"/"
    +request.getServletContext().getContextPath()+"/";
%>
 
<form action="<%=basePath %>LoginServlet" method="post">
</form>

Ps:注意:此处的/可以去掉,因为getContextPath()返回值有/。

Servlet 生命周期

i、Servlet生命周期分为三个阶段:

   1、初始化阶段调用init()方法。

   2、响应客户请求阶段调用service()方法,其实。

   3、终止阶段调用destroy()方法。

image.png

Ps:如果项目从Tomcat中移除,才会调用 destroy方法,并不是关闭程序(不会调用destroy方法)。

5.为什么会这样?image.png

Ps:总结:这样写代码是不是很繁琐,所以Servlet主要用于业务逻辑处理,JSP用于展示内容。

6.JSP内置对象和Servlet中类的对应关系image.png7.注解:@WebServlet("/LifeServlet") 相当于

<servlet>
  <servlet-name>LoginServlet</servlet-name>
  <servlet-class>cn.java.servlet.LoginServlet</servlet-class>
</servlet>
 
<servlet-mapping>
  <servlet-name>LoginServlet</servlet-name>
  <url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>

8.Servlet - service 方法重写问题

9.请求与响应

 - 浏览器对服务器的一次访问称之为一次请求,请求用 HttpServletRequest  对象来表示。

 - 服务器给浏览器的一次反馈称之为一次响应,响应用HttpServletResponse对象来表示。

10.ServletContext 与 ServletConfig

 1 Java是一门面向对象的语言,万事万物皆对象。整个JavaWeb工程也可以用一个对象来表示,这个对象就是ServletContext类型。

package cn.java.servlet;
 
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/Demo1Servlet")
public class Demo1Servlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取代表某一个JavaWeb工程的ServletContext对象
        // Context对象是一个域对象,可以往某一个域对象中存放数据,并且还可以取出存放的数据
        ServletContext context = this.getServletContext();
        // 往context域对象中存放数据
        context.setAttribute("username", "张三");
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
package cn.java.servlet;
 
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/Demo2Servlet")
public class Demo2Servlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        // 取出key=username所对应的值
        Object result = context.getAttribute("username");
        System.out.println(result);
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
Input:
localhost:8888/imooc_servlet1/Demo2Servlet
 
Console:
张三

 2 我们可以在web.xml文件中给某一个Servlet配置一些配置信息,当服务器被启动的时候,这些配置信息就会被封装到某一个ServletConfig对象中去。因此ServletConfig表示的是某一个Servlet的配置文件。

<!-- web.xml -->
<servlet>
  <servlet-name>Demo3Servlet</servlet-name>
  <servlet-class>cn.java.servlet.Demo3Servlet</servlet-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
  </init-param>
</servlet>
 
<servlet-mapping>
  <servlet-name>Demo3Servlet</servlet-name>
  <url-pattern>/Demo3Servlet</url-pattern>
</servlet-mapping>
package cn.java.servlet;
 
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class Demo3Servlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 首先需要获取ServletConfig对象
        ServletConfig sc = this.getServletConfig();
        // 获取sc这个对象中封装的参数信息
        String encoding = sc.getInitParameter("encoding");
        System.out.println("encoding=" + encoding);
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
Input:
localhost:8888/imooc_servlet1/Demo3Servlet
 
Console:
encoding=utf-8

 3 总结:ServletContext对象:表示的是整个JavaWeb工程;ServletConfig对象:表示的是某一个Servelt中的配置文件。

11.转发与重定向的区别【★★★★★】

  - 实现转发调用的是HttpServletRequest对象中的方法,实现重定向调用的是HttpServletResponse对象中的方法。

- 转发时浏览器中的url地址栏不会发生改变,重定向时浏览器中的url地址会发生改变。

 - 转发时浏览器只请求一次服务器,重定向时浏览器请求两次服务器。

 - 转发可以通过 request、session、application 传输数据,重定向可以通过 session、application 传输数据。

 - 转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:

转发过程:客户浏览器发送http请求 ——> web服务器接受此请求 ——> 调用内部的一个方法在容器内部完成请求处理和

转发动作 ——> 将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

重定向过程:客户浏览器发送http请求 ——> web服务器接受后发送302状态码响应及对应新的location给客户浏览器 ——> 客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址 ——> 服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

附:重定向,其实是两次request:

第一次,客户端request A,服务器响应,并 response 回来,告诉浏览器,你应该去B。这个时候浏览器可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。


- 通俗版解释,假设你去办理某个执照...

重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。

转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。

package cn.java.servlet;
 
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/Demo4Servlet")
public class Demo4Servlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 转发带数据给某个jsp页面
        // request.setAttribute("username", "王二麻子 ");
        // request.getRequestDispatcher("/demo.jsp").forward(request, response);
 
        // 通过重定向带数据过去
        ServletContext sc = request.getServletContext();
        sc.setAttribute("goods", "娃娃");
        response.sendRedirect("/imooc_servlet1/demo.jsp");
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>转发与重定向获取数据</title>
</head>
<body>
    <!-- 取出Demo4Servlet中传递过来的数据 -->
    <%-- <%
        String username = (String)request.getAttribute("username");
        out.print(username);
    %> --%>
    
    <%
        String goods = (String)application.getAttribute("goods");
        out.print(goods);
    %>
</body>
</html>

12.Servlet - 映射多地址实现跳转

13.JavaWeb - JSP、Servlet、Request、Response、Get、Post 中文乱码问题

14.web.xml 中 load-on-startup 标签的含义

在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:标记容器是否在启动的时候就加载这个servlet。

i、当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;

ii、当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载;

iii、非负数的值越小,启动该servlet的优先级越高。

Example:
 
<servlet>  
 <servlet-name>initservlet</servlet-name>  
 <servlet-class>com.bb.eoa.util.initServlet</servlet-class>  
 <init-param>  
  <param-name>log4j-init-file</param-name>  
  <param-value>config/log.properties</param-value>  
 </init-param>  
 <load-on-startup>1</load-on-startup>  
</servlet>  

15.不需要servlet处理的配置:default

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>

16.待更新...

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
19795 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
29129 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
13569 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22535 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
16424 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20689 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14897 0
+关注
2689
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载