JavaWeb02

简介: JavaWeb02

JavaWeb02

一、Web程序的执行流程

一句话,客户端发出请求,服务器处理请求后做出响应。

二、Servlet基本使用

2.1 Servlet是什么?

Servlet,全称Sevlet Applet,服务端小程序,是一种用java语言来开发动态网站的技术。

Servlet也是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。

例如客户端发出登录请求,或者输出注册请求,这些请求都应该有servlet来完成处理!servlet需要我们自己来编写,每个servlet必须实现javax.servlet.Servlet接口

2.1.1Servlet的执行过程

当使用url进行对Tomcat请求时,访问流程如下所示

  1. 先找到Tomcat
  2. 根据url中的名称找到具体的项目
  3. 找到项目下的web.xml,然后寻找url-pattern,看有没有哪个pattern对应url中的值
  4. 找到servlet-mapping中的servlet-name
  5. 找到前面注册的servlet-name
  6. 根据servlet-class中的值找到对应的Servlet类并创建实例
  7. 执行Servlet中的方法
2.1.2 Servlet的生命周期

2.2为什么使用Servlet?

  • Servlet是在服务器端运行的Java程序,可以接收客户端的请求并做出响应

  • Servlet可以动态生成HTML内容对客户端进行响应

Servlet与JSP的关系

  • JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。
  • JSP更擅长表现于页面显示,servlet更擅长于逻辑控制。
  • 客户端发出请求,服务器通过JSP将Java代码翻译、编译后,Servlet再将Java代码生成HTML代码响应给客户端。

2.3怎么实现Servlet

2.3.1实现javax.servlet.Servlet接口;
(1)在java类里实现Servlet接口
public class TestServlet implements Servlet {
  @Override
  public void destroy() {
    //销毁方法 临si前调用一次
    System.out.println("销毁了");
      }
  @Override
  public ServletConfig getServletConfig() {
    //获取Servlet下的ServletConfig对象
    //ServletConfig对象获取web.xml的信息
    return null;
  }
  @Override
  public String getServletInfo() {
    //获取Servlet的相关系统信息
    return null;
  }
  @Override
  public void init(ServletConfig arg0) throws ServletException {
    //Servlet初始化 启动后只调用一次
    System.out.println("初始化");
  }
  @Override
  public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    //处理客户端请求,每次处理请求时都会被调用
    System.out.println("处理请求");
  }
}
(2)再在web.xml里为Servlet配置Servlet路径

为什么要配置路径?

浏览器不能直接访问Java文件,而Servlet在在Java文件里,所以需要在web.xml里为Servlet配置Servlet路径,将Servlet和Servlet路径绑定,让浏览器访问Servlet路径,从而访问到Servlet。

<!-- 配置servlet(RegisterServlet) -->
    <servlet>
    <description></description>
    <servlet-name>RegisterServlet</servlet-name>
    <servlet-class>com.zking.test.RegisterServlet</servlet-class>
  </servlet>
  <!-- 映射servlet(RegisterServlet) -->
  <servlet-mapping>
    <servlet-name>RegisterServlet</servlet-name>
    <url-pattern>/RegisterServlet</url-pattern><!-- 请求路径,记得加"/"! -->
  </servlet-mapping>
<!-- 注意:但凡是改了web.xml文件的内容 务必记得重启服务器再运行!!! -->
2.3.2继承javax.servlet.http.HttpServlet类

HttpServlet是Servlet接口的一个实现类,并且它是一个抽象类,servlet.http包中定义了采用HTTP通信协议(一个无状态协议)的HttpServlet类。

创建HttpServlet步骤

  • 继承HttpServlet抽象类
  • 重写HttpServlet的部分方法,如doGet()或doPost()方法
  • 获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串
  • 生成HTTP响应结果。通过HttpServletResponse对象生成响应结果

HttpServlet的实现由两种方式

实现方式一:.xml配置实现
  A.配置xml文件(实现方式同Servlet接口的.xml配置相同,此处不再重复)
  B.继承HttpServlet抽象类
  C.重写get()、post()方法
实现方式二:注解实现
  直接在Package包下新建Servlet

在Servlet3.0开始,可以通过注解的方式进行配置Servlet,不用在web.xml中再进行配置。

  • 好处:
  • 支持注解配此。可以不要web. xml了。
  • 步骤:
  • 创建JavaEE项目, 选择Servlet的版本3.0以上,可以不创建web . xml
  • 定义一个类,继承Servlet接口
  • 复写方法
  • 在类上使用@WebServlet注解,进行配说
  • @webServlet(“资源路径”)|
/**
 * Servlet implementation class Register
 */
@WebServlet("/RegisterServlet.do")//请求路径
public class Register extends HttpServlet {
  private static final long serialVersionUID = 1L;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Register() {
        super();
        // TODO Auto-generated constructor stub
    }
  /**
   * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
   */
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    response.getWriter().append("Served at: ").append(request.getContextPath());
  }
  /**
   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
  }
}

三、request和response

3.1HttpServletRequest

HttpServletRequest表示请求。Servlet容器对于接受到的每一个Http请求,都会创建一个ServletRequest对象,并把这个对象传递给Servlet的Sevice( )方法。其中,ServletRequest对象内封装了关于这个请求的许多详细信息。

  • HttpServletRequest表示Http环境中的Servlet请求。它扩展于javax.servlet.ServletRequest接口
【String getParameter(String name)】:根据name值得到value值
【String getParameterValues(String name)】:根据name值得到多个value值 例如:爱好
【void setCharacterEncoding(String charset)】:设置请求的编码方式 防止中文乱码
【void setAttribute(String key, Object value)】:存值[键值对的方式]
【Object getAttribute(String key)】:根据键拿到值
其中,getParameter是在ServletRequest中最常用的方法,可用于获取查询字符串的值。

3.2HttpServletResponse

javax.servlet.ServletResponse接口表示一个Servlet响应,在调用Servlet的Service( )方法前,Servlet容器会先创建一个ServletResponse对象,并把它作为第二个参数传给Service( )方法。ServletResponse隐藏了向浏览器发送响应的复杂过程。

【void setContentType(String arg0)】:设置响应的编码方式
【PrintWriter getWriter()】:获得内置对象out

其中的getWriter方法,它返回了一个可以向客户端发送文本的的Java.io.PrintWriter对象。默认情况下,PrintWriter对象使用ISO-8859-1编码(该编码在输入中文时会发生乱码)。

在向客户端发送响应时,大多数都是使用该对象向客户端发送HTML。

在Service API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。 由于HTTP请求消息分为状态行,响应消息头,响应消息体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码,响应消息头,响应消息体的方法。

四、JSP页面表单提交方式

两种方式
<form action="请求路径url" method="get/post"></form>
1.get(默认)

是用来从服务器上获得数据;地址栏会显示信息;安全性低;有数据长度的限制,最大为1024字节;

2.post(推荐)

是用来向服务器上传递数据;安全性高

3.方法
  • 1.type=“submit”
  • 2.type=“image”
  • 3.使用链接来提交表单,javascript的DOM模型
  • 4.通过onsubmit事件提交
  • 5.通过ajax提交

五、页面跳转方式

  • 使用href超链接标记 客户端跳转
  • 表单提交 客户端跳转
  • 使用JavaScript 客户端跳转
  • 重定向:使用 response.sendRedirect() 客户端跳转
  • 转发:使用RequestDispatcher.forward() 服务器跳转
  • 使用forward动作标记 服务器跳转【后面将 JSTL】
  • 使用response对象实现页面跳转的第二种方法,setHeader()方法

5.1客户端跳转

5.1.1 href 超链接
<a href="想要跳转的jsp页面">跳转<a/>
例如:<a href="newPage.jsp">跳转<a/>
<a href="想要跳转的url">跳转<a/>
例如:<a href="https://blog.csdn.net/weixin_43656426">跳转<a/>
5.1.2表单提交 客户端跳转
<form name="form1" method="POST" action="newPage.jsp">  ------action中可以是jsp页面也可以是url路由
   <input type="text" name="name">  
   <input type="text" name="password">  
   <input type="submit" value="提交">  
</form>
5.1.3使用JavaScript 客户端跳转
//Js 页面跳转(父页面,外层页面,本页面)
"window.location.href=''"、"location.href=''"//是本页面跳转
"window.navigate('')"
"window.location.replace('')"
"parent.location.href=''"//是上一层页面跳转
"top.location.href=''"//是最外层的页面跳转
5.1.4转发跳转

使用 response.sendRedirect() 跳转

response.sendRedirect("newPage.jsp");//jsp页面
response.sendRedirect("https://blog.csdn.net/weixin_43656426");//url路径
5.1.5setHeader()方法
response.setCharacterEncoding("utf-8");  
response.setHeader("iso-8859-1","utf-8");  
request.setCharacterEncoding("utf-8");  
response.setHeader("Refresh","5;url=newPage.jsp");  
response.setHeader("Refresh","等待的秒数;url=绝对路径或者相对路径"); //路径问题sendredirect也一样,绝对路径相对路径都没意见,此句代码是等待5秒之后跳转

5.2服务端跳转

5.2.1重定向

RequestDispatcher.forward()跳转

request.getRequestDispatcher("newPage.jsp").forward(response,request);
request.getRequestDispatcher("https://blog.csdn.net/weixin_43656426").forward(request,response);
5.2.2forward动作标记
<jsp:forward page="newPage.jsp" />

5.3转发和重定向

  • 请求转发属于内部跳转,服务器内部转发,整个过程处于同一个请求当中,不可以跳到其他网站,只能在同一个网站内跳不同的页面
  • 重定向则是站外跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。不在同一个请求。重定向,实际上客户端会向服务器端发送两个请求
  • 取值
  • 请求转发(站内跳转):可以获取保存在request作用域中的数据
  • 重定向(站外跳转): 不能获取保存在request作用域中的数据
  • 地址栏
  • 请求转发(站内跳转):地址栏不发生变化
  • 重定向(站外跳转):地址栏显示跳转页面路径
  • 请求次数
  • 请求转发(站内跳转):仅发起一次请求,所以可以获取到保存在request中的数据
  • 重定向(站外跳转):发起多次请求,所以不能获取request中的数据
  • 性能(效率)
  • 请求转发(站内跳转) > 重定向(站外跳

六、ServletConfig类详解

6.1 基本介绍

概述

ServletConfig是Servlet的配置参数对象,在Servlet的规范中,允许为每一个Servlet都提供一些初始化的配置,所以每一个Servlet都有一个ServletConfig。

作用

当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init()方法传入一个ServletConfig对象,即传入一些配置信息给Servlet。

生命周期

应用一加载则创建,应用停止则被销毁;

创建时间

创建完Servlet对象时,接着创建。Servletconfig对象

常用方法

返回值 方法名 说明
String getInitParameter(String name) 根据参数名称获取参数的值
Enumeratin getInitParameterNames() 根据所有参数名称的枚举
String getSevletName() 获取servlet的名称
ServletContext getServletContext() 获取servletContext对象

6.2 ServletConfig的配置方式

  • 在标签种,通过标签来配置。有两个子标签:
  • :代表初始化参数的key。
  • : 代表初始化参数的value
<!-- 配置servlet(HelloServlet) -->
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.zking.HelloServlet</servlet-class>
    <!-- 初始化参数 -->
    <init-param>
      <param-name>参数名</param-name>
      <param-value>参数对应值</param-value>
    </init-param>
  </servlet>
<!--只能在对应的一个servlet中拿到值:-->
this.getInitParameter("参数名");

七、ServletContext类详解

7.1 ServletConText介绍

概述:ServletContext对象是一个应用上下文对象,也是一个域对象。表示Servlet应用程序,每个web应用程序都只有一个ServletContext对象。

ServletContext对象的作用

  • 有了ServletContext对象,就可以共享从应用程序中的所有资源访问到的数据信息,并且可以动态注册web对象。
  • 可以获得应用域的全局初始化参数,以及达到Servlet之间的数据共享
  • 可以作为域对象在整个应用中共享数据;域对象即在一定的作用范围内实现资源共享;
  • 可以用来获取应用中的资源在服务器上的绝对路径;
  • 获取文件的mime类型: 在网络传输中,并不是以扩展名来区分文件的类型,都是以mime类型;如:text/html;表示一个html文件。

生命周期: 应用一加载则创建,应用被停止则销毁

创建时间: 加载web应用时,创建ServletContext对象。

域对象

  • 域对象指的是对象有作用域,即有作用范围。域对象可以实现数据的共享,不同作用范围对象,共享数据的范围能力也不同。
  • 在Servlet规范中,一共有4个域对象。其他三个是:request请求域PageContext页面域session会话域。ServletContext就是其中的一个。是web应用中最大的作用域,也叫application应用域,可以实现整个应用之间的数据共享!

常用方法

返回值 方法名 说明
void setAttribute(String name,Object value) 向域对象中存储数据
Object getAttribute(String name) 通过名称获取域对象中的数据
void removeAttribute(String name) 通过名称移除域对象中的数据
Enumeration getAttributeNames() 获取域对象中所有数据的名称
String getSevletContextName() 获取servletContext的名称
String getContextPath() 获取当前应用的访问虚拟目录
String getServletInfo() 获取服务器名称和版本信息
String getInitParameter(String name) 根据名称获取全局配置的值
Enumeration getInitParameters() 获取全局配置的所有名称
String getRealPath(String path) 根据虚拟目录获取应用部署额磁盘绝对路径

7.2 ServletContext配置方式

  • ServletContext不像ServletConfig接口在Servlet标签里配置,而是针对于整个应用的配置,也叫全局的初始化参数;
  • 在标签中,通过标签来配置,有两个子标签:
    : 代表全局初始化参数的key。
    : 代表全局初始化参数的value。
<context-param>
    <param-name>参数名</param-name>
    <param-value>参数对应值</param-value>
</context-param>
<!--可被整个应用共享:-->
this.getServletContext().getInitParameter("参数名");
目录
相关文章
|
Java Apache C++
74.【JavaWeb -02】(七)
74.【JavaWeb -02】
56 0
|
11月前
|
前端开发 网络协议 Java
javaweb的理解
javaweb的理解
67 0
|
前端开发 Java 数据库
75.【JavaWeb-03】(一)
75.【JavaWeb-03】
36 0
|
Java
74.【JavaWeb -02】(三)
74.【JavaWeb -02】
43 0
|
存储
73.【JavaWeb-01】(六)
73.【JavaWeb-01】
36 0
|
Java
74.【JavaWeb -02】(五)
74.【JavaWeb -02】
36 0
|
前端开发 Java
73.【JavaWeb-01】(八)
73.【JavaWeb-01】
40 0
|
Java
74.【JavaWeb -02】(六)
74.【JavaWeb -02】
33 0
|
前端开发 数据安全/隐私保护
75.【JavaWeb-03】(四)
75.【JavaWeb-03】
46 0