Maison  >  Article  >  Java  >  apprentissage et finition javaweb - objet HttpServletResponse

apprentissage et finition javaweb - objet HttpServletResponse

php是最好的语言
php是最好的语言original
2018-08-09 10:40:391718parcourir

1. Applications courantes de HttpServletResponse - générer des codes de vérification

1.1. Générer des images aléatoires à utiliser comme codes de vérification

Générer L'image utilise principalement une classe

BufferedImage,

 

apprentissage et finition javaweb - objet HttpServletResponse

Générer un exemple d'image aléatoire :

package gacl.response.study;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseDemo03 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        response.setHeader("refresh", "5");//设置refresh响应头控制浏览器每隔5秒钟刷新一次
        //1.在内存中创建一张图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        //2.得到图片
        //Graphics g = image.getGraphics();
        Graphics2D g = (Graphics2D)image.getGraphics();
        g.setColor(Color.WHITE);//设置图片的背景色
        g.fillRect(0, 0, 80, 20);//填充背景色
        //3.向图片上写数据
        g.setColor(Color.BLUE);//设置图片上字体的颜色
        g.setFont(new Font(null, Font.BOLD, 20));
        g.drawString(makeNum(), 0, 20);
        //4.设置响应头控制浏览器浏览器以图片的方式打开
        response.setContentType("image/jpeg");//等同于response.setHeader("Content-Type", "image/jpeg");
        //5.设置响应头控制浏览器不缓存图片数据
        response.setDateHeader("expries", -1);
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        //6.将图片写给浏览器
        ImageIO.write(image, "jpg", response.getOutputStream());
    }

    /**
     * 生成随机数字
     * @return
     */
    private String makeNum(){
        Random random = new Random();
        String num = random.nextInt(9999999)+"";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 7-num.length(); i++) {
            sb.append("0");
        }
        num = sb.toString()+num;
        return num;
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
Exécuter Les résultats sont les suivants :

apprentissage et finition javaweb - objet HttpServletResponse

2. Applications courantes de HttpServletResponse - définition des en-têtes de réponse pour contrôler le comportement du navigateur

2.1. Définition des en-têtes de réponse http pour contrôler les navigateurs de la mise en cache. contenu actuel du document

 response.setDateHeader("expries", -1);
 response.setHeader("Cache-Control", "no-cache");
 response.setHeader("Pragma", "no-cache");
2.2. Définir l'en-tête de réponse http pour contrôler le navigateur afin d'actualiser régulièrement la page Web (rafraîchir)

response.setHeader("refresh", "5");//设置refresh响应头控制浏览器每隔5秒钟刷新一次
2.3. >

La redirection de demande fait référence à :

Après qu'une ressource Web reçoit une demande d'un client, elle informe le client d'accéder à une autre ressource Web. Scénario d'application : l'utilisateur se connecte. L'utilisateur visite d'abord la page de connexion. Après une connexion réussie, il accédera à une certaine page. Ce processus est un processus de redirection de demande

. Méthode d'implémentation : réponse.sendRedirect (String location), c'est-à-dire appeler la méthode sendRedirect de l'objet de réponse pour implémenter la redirection de la demande

Le principe d'implémentation interne de sendRedirect :


Utiliser les paramètres de réponse Code d'état 302 et paramètres L'en-tête de réponse de localisation implémente la redirection Par exemple :

3. Méthode d'écriture recommandée de l'adresse URL dans l'ingénierie Web
package gacl.response.study;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseDemo04 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 1.调用sendRedirect方法实现请求重定向,
         * sendRedirect方法内部调用了
         * response.setHeader("Location", "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
         * response.setStatus(HttpServletResponse.SC_FOUND);//设置302状态码,等同于response.setStatus(302);
         */
        response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
        
        //2.使用response设置302状态码和设置location响应头实现重定向实现请求重定向
        //response.setHeader("Location", "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
        //response.setStatus(HttpServletResponse.SC_FOUND);//设置302状态码,等同于response.setStatus(302);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

Dans le développement JavaWeb, tant que vous écrivez une adresse URL, il est recommandé de commencer par "/", c'est-à-dire d'utiliser un chemin absolu. Alors que représente ce "/" ? Vous pouvez mémoriser "/" de la manière suivante :

Si "/" est utilisé pour le serveur, il représente le projet Web en cours. Si "/" est utilisé pour le navigateur, il représente le répertoire webapps.

3.1,

"/"

représente les scénarios d'application courants du actuelprojet Web

① .ServletContext.getRealPath(String path) obtient le chemin absolu de la ressource

/**
* 1.ServletContext.getRealPath("/download/1.JPG")是用来获取服务器上的某个资源,
* 那么这个"/"就是给服务器用的,"/"此时代表的就是web工程
 * ServletContext.getRealPath("/download/1.JPG")表示的就是读取web工程下的download文件夹中的1.JPG这个资源
* 只要明白了"/"代表的具体含义,就可以很快写出要访问的web资源的绝对路径
*/
this.getServletContext().getRealPath("/download/1.JPG");
② Transférer vers d'autres pages côté serveur

.

 /**
 * 2.forward
  * 客户端请求某个web资源,服务器跳转到另外一个web资源,这个forward也是给服务器用的,
 * 那么这个"/"就是给服务器用的,所以此时"/"代表的就是web工程
 */
 this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
③. Utilisez la directive include ou la balise pour introduire la page

 <%@include file="/jspfragments/head.jspf" %>
À ce stade, "/" représente les projets Web. .
<jsp:include page="/jspfragments/demo.jsp" />

3.2,

"/"

représente les scénarios d'application courants du répertoire webapps

① Utilisez sendRedirect pour. mettre en œuvre la redirection de demande

Le serveur envoie une adresse URL au navigateur Une fois que le navigateur a obtenu l'adresse URL, il demande ensuite au serveur, donc ce "/" est destiné au navigateur. . Lorsque "/" représente le répertoire webapps, l'adresse "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp" fait référence à "webappsJavaWeb_HttpServletResponse_Study_20140615index.jsp"
response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");

 

response.sendRedirect("/project name). /répertoire de dossiers / Page" );

Cette façon d'écrire consiste à coder en dur le nom du projet dans le programme. Si le nom du projet change un jour, le programme devra être modifié. Il est donc recommandé d'utiliser ce qui suit. méthode d'écriture flexible : Remplacez

par
response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");

Le contenu obtenu par request.getContextPath() est "/JavaWeb_HttpServletResponse_Study_20140615", ce qui est plus flexible. Utilisez
response.sendRedirect(request.getContextPath()+"/index.jsp");

request.getContextPath() au lieu de "/project name". Il est recommandé d'utiliser cette méthode, elle est flexible et pratique  ! ②.

Utiliser un lien hypertexte pour sauter

Il s'agit du saut de lien hypertexte utilisé par le navigateur client, ce "/" est destiné au navigateur à utiliser, à cette fois, "/" représente le répertoire webapps.
<a href="/JavaWeb_HttpServletResponse_Study_20140615/index.jsp">跳转到首页</a>

Utilisez des hyperliens pour accéder aux ressources Web. Il est recommandé d'utiliser la méthode d'écriture suivante pour améliorer le chemin absolu :

<a href="${pageContext.request.contextPath}/index.jsp">跳转到首页</a>

De cette façon, vous pouvez éviter le nom. du projet apparaissant dans le chemin. , utilisez ${pageContext.request.contextPath} au lieu de "/JavaWeb_HttpServletResponse_20140615"

③.Formulaire de soumission

Il s'agit du navigateur client qui soumet le formulaire au serveur, donc ce "/" est utilisé par le navigateur. À ce stade, "/" représente le répertoire des applications Web.
<form action="/JavaWeb_HttpServletResponse_Study_20140615/servlet/CheckServlet" method="post">    
         <input type="submit" value="提交">
 </form>

Pour le chemin absolu de l'attribut action dans la soumission du formulaire, il est également recommandé d'utiliser la méthode suivante pour améliorer :

<form action="${pageContext.request.contextPath}/servlet/CheckServlet" method="post">
          <input type="submit" value="提交">
 </form>
 

${pageContext.request .contextPath} est obtenu. Celui-ci est "/JavaWeb_HttpServletResponse_Study_20140615"

  ${pageContext.request.contextPath}的效果等同于request.getContextPath(),两者获取到的都是"/项目名称"

④.js脚本和css样式文件的引用

<%--使用绝对路径的方式引用js脚本--%>
  <script type="text/javascript" src="${pageContext.request.contextPath}/js/index.js"></script>
  <%--${pageContext.request.contextPath}与request.getContextPath()写法是得到的效果是一样的--%>
  <script type="text/javascript" src="<%=request.getContextPath()%>/js/login.js"></script>
  <%--使用绝对路径的方式引用css样式--%>
  <link rel="stylesheet" href="${pageContext.request.contextPath}/css/index.css" type="text/css"/>

综合范例:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>



  
    "/"代表webapps目录的常见应用场景
    <%--使用绝对路径的方式引用js脚本--%>
    
    <%--${pageContext.request.contextPath}与request.getContextPath()写法是得到的效果是一样的--%>
    
    <%--使用绝对路径的方式引用css样式--%>
      
  
  
  
      <%--form表单提交--%>
       
<%--超链接跳转页面--%> <a href="${pageContext.request.contextPath}/index.jsp">跳转到首页</a>

 四、response细节问题

  getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
  getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。  
  Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。 
  Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。

相关推荐:

strust2 获取HttpServletResponse对象

菜菜菜鸟学习之JavaWeb 入门1(自己的学习理解,不对之处请大神们多多指教啊)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn