リダイレクト
まず最初のセットに応じてステータスコードを設定します
//访问Demo1自动跳转至Demo2 //设置状态码 response.setStatus(302); //设置响应头 response.setHeader("location","/response/responseDemo2");
完全なリダイレクションのsendRedirect(文字列の位置)メソッド
//访问Demo1自动跳转至Demo2 response.sendRedirect("/response/responseDemo2");
リダイレクト機能:
redirect
アドレスバーの変更
リダイレクションは他のサイト(サーバー)のリソースにアクセスすることができます
response.sendRedirect("https://www.baidu.com");
リダイレクトが2つの要求であります
転送機能:
forward
- そのままパスの転送
- 現在のサーバーでのみアクセスできリソースを転送
- 転送要求で、要求オブジェクトは、データを共有するために使用することができます
パスの文言:
カテゴリパス
- 相対パス
- 現在のソースとターゲットリソース間の関係を見つけます
- 絶対パス:唯一のリソースは、絶対パスによって決定することができます
- ルール:パスの定義が使用されている誰に裁判官
- クライアントブラウザ:仮想ディレクトリを追加する必要があります(プロジェクトのアクセス・パス)
- 使用するサーバー:仮想ディレクトリを追加する必要はありません
- ルール:パスの定義が使用されている誰に裁判官
ブラウザにサーバーの出力文字データ
ステップ
文字ストリーム出力を取得
出力データ
文字化け注意
//设置流的默认编码:ISO-8859-1 设置为GBK,防止乱码 response.setCharacterEncoding("GBK"); //告诉浏览器,服务器发送的消息体数据的编码 //response.setHeader("content-type","text/html;charset=utf-8"); //简单形式。设置编码 response.setContentType("text/html;charset=utf-8"); //获取字符输出流 PrintWriter writer = response.getWriter(); //输出数据 writer.write("hello");
ブラウザにサーバ出力バイトデータ
ステップ
- バイトの出力ストリームを取得
- 出力データ
response.setContentType("text/html;charset=utf-8"); //获取字节输出流 ServletOutputStream outputStream = response.getOutputStream(); //输出数据 outputStream.write("hellow".getBytes());
検証コード
- エッセンス:写真
- 目的:悪質な操作を防ぐために
サーブレットコード:
//创建对象,在内存中生成图片(验证码对象)
int width=100;
int height=50;
BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//美化
//填充背景色
Graphics graphics=bufferedImage.getGraphics();
//背景颜色
graphics.setColor(Color.PINK);
graphics.fillRect(0,0,width,height);
//字体颜色
graphics.setColor(Color.BLUE);
graphics.drawRect(0,0,width-1,height-1);
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//生成随机角标
Random random=new Random();
int x=0;
for (int j = 0; j < 4; j++) {
int i = random.nextInt(str.length());
char A=str.charAt(i);
graphics.drawString(A+"",x+=20,25);
}
//画线
for (int i = 0; i < 4; i++) {
int x1 = random.nextInt(100);
int x2 = random.nextInt(100);
int y1 = random.nextInt(50);
int y2 = random.nextInt(50);
graphics.drawLine( x1, y1, x2, y2);
}
//输出演示
ImageIO.write(bufferedImage,"jpg",response.getOutputStream());
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<img id="check" src="/response/checkCodeServlet"/>
<a id="change" href="">看不清换一张</a>
</body>
</html>
ダウンロードのServletContext
- ダウンロードの必要条件:
- ページは、ハイパーリンクを表示します
- ハイパーリンクのポップアップメッセージボックスのダウンロードをクリックした後
- 完全な画像ファイルをダウンロード
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/rui/downloadServlet?filename=1.jpg">图片</a>
</body>
</html>
サーブレット
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author rui
* @create 2019-08-07 22:07
*/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取参数文件名
String filename = request.getParameter("filename");
//找到文件真是路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//设置response的响应头类型context-type
//获取文件类型
String mimeType = servletContext.getMimeType(filename);
response.setHeader("context-type",mimeType);
//设置响应头打开方式content-disposition
response.setHeader("content-disposition","attachment;filename="+filename);
response.setContentType("content-disposition:attachment;filename=xxx");
//用字节流关联
FileInputStream fis = new FileInputStream(realPath);
//将输入流写出到输出流
ServletOutputStream outputStream = response.getOutputStream();
byte[] bytes = new byte[1024 * 8];
int len = 0;
while ((len = fis.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
ヒント1.JPGウェブはIMGファイルファイルの下に置かれています
問題:
- 中国のファイル名の問題(中国語となって「___」フォーム)
ソリューション:
クライアント情報が使用するブラウザのバージョンを取得します。
符号化モードのファイル名を設定し、バージョン情報に応じて、
- コードは以下の通りであります:
使用する
DownLoadUtils
ツールimport sun.misc.BASE64Encoder; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class DownLoadUtils { public static String getFileName(String agent, String filename) throws UnsupportedEncodingException { if (agent.contains("MSIE")) { // IE浏览器 filename = URLEncoder.encode(filename, "utf-8"); filename = filename.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它浏览器 filename = URLEncoder.encode(filename, "utf-8"); } return filename; } }
応じて設定する前に、まず次のコードを追加します。
//解决中文文件名问题 //获取user-agent请求头 String header = request.getHeader("user-agent"); filename = DownLoadUtils.getFileName(header, filename);
サーブレット完全なコード:
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author rui
* @create 2019-08-07 22:07
*/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取参数文件名
String filename = request.getParameter("filename");
//找到文件真是路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//设置response的响应头类型context-type
//获取文件类型
String mimeType = servletContext.getMimeType(filename);
response.setHeader("context-type", mimeType);
//设置响应头打开方式content-disposition
//解决中文文件名问题
//获取user-agent请求头
String header = request.getHeader("user-agent");
filename = DownLoadUtils.getFileName(header, filename);
response.setHeader("content-disposition", "attachment;filename=" + filename);
response.setContentType("content-disposition:attachment;filename=xxx");
//用字节流关联
FileInputStream fis = new FileInputStream(realPath);
//将输入流写出到输出流
ServletOutputStream outputStream = response.getOutputStream();
byte[] bytes = new byte[1024 * 8];
int len = 0;
while ((len = fis.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}