Servlet基础使用完成转发和重定向

原创 2016年05月31日 23:12:20

要知道servlet的使用需要了解servlet的工作基础
什么是servlet:sun公司制订的一种用来扩展web服务器功能的组件规范。
servlet之前是使用cgi(common gateway interface),收到请求会调用cgi,后面servlet就因运而生,是一种更好的技术,需要符合一定的组件规范,即实现部分软件模块,组件需要部署到容器的内部,servlet本身就是一种容器。
下面是基于浏览器和客户端的请求详细图解:

这里写图片描述
这里写图片描述

编写一个简单servlet程序,在Eclipse中新建一个web工程:
首先需要在src目录下新建一个类继承HttpServlet,可以重写HttpServlet中的service方法实现相应的功能,还需要在WEB-INF目录下找到web.xml,在其中配置

    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.heying.web.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

Java code:

public class HelloServlet extends HttpServlet{
private static final long serialVersionUID = 1L;

    @Override
    public void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        out.print("hello servlet !<br>");
        out.print("i am a programmer !<br>");
        out.close();
    }
}

这个程序使用的是PrintWriter 来输出一个页面数据返回类型是text/html
这里写图片描述

这边是一个简单的servlet程序,需要完成复杂的功能还需要后面继续学习
为了更好的了解servlet需要知道几个简单知识点:
什么是Http协议:由w3c制订的一种网络应用层协议,规定了浏览器与web服务器之间如何通信以及相应的数据格式。目前已经出现Https协议(加密的)。

通信步骤大致分为:

1.浏览器建立与服务器之间的连接。
2.浏览器将请求数据打包并发送。
3.服务器将响应数据打包并发送。
4.服务器立即关闭连接。
一次请求一次连接,高效
数据格式:

请求行:请求方式 请求资源路径 协议类型和版本
消息头:是一些键值对,表示特定的含义,浏览器与服务器之间都可以发送。比如,浏览器可以发送一个”User-Agent”消息头,告诉服务器,浏览器的类型和版本。
实体内容:只有当请求方式为post的时候,实体内容才有数据(请求参数),如果请求方式是get,请求参数会添加到请求资源路径的后面。
状态行: 协议及版本 状态码 状态描述,比如404 500等错误代码

get和post请求:

get请求:
1.会将请求参数添加到请求资源路径的后面,因为请求行最多只能存放2k左右的数据,所以,get请求只能发送少量的请求参数。
2.会将请求参数显示在浏览器地址栏,不安全比如,路由器会记录访问地址。
post请求:
设置了表单的method=”post”。
1.将请求参数放到实体内容里面,所以,可以提交大量的数据给服务器。
2.不会将请求参数显示在浏览器地址栏,相对安全(不会加密,对于敏感数据,需要加密)。

输出中文:
java语言使用unicode字符集来保存字符。
编码:将unicode字符集对应的字节数组转换成某种本地字符集(gbk,utf-8等等)对应的字节数组。
解码:某种本地字符集(gbk,utf-8等等)对应的字节数组转换成unicode字符集对应的字节数组。

路径问题:
相对路径
不以”/”开头的路径。
绝对路径
以”/”开头的路径。
不要直接写绝对路径,要使用以下方法获得应用名:request.getContextPath()

cookie技术:
服务器临时保存在浏览器端的少量的数据。
当浏览器向服务器发送请求时,服务器会将少量的数据以set-cookie消息头的方式发送给浏览器,浏览器会将这些数据临时保存下来;当浏览器再次访问服务器时,会将之前保存的数据以cookie消息头的方式发送给服务器。
使用new Cookie(String name,String value)来设置 response.addCookie(…);

几个简单的知识先了解后,来简单说明下servlet的工作原理和过程servlet的生命周期:
1. 实例化
器收到请求之后,创建servlet对象,需要给这个servlet配置参数。该参数是一个大于等于0的整数。值越小,优先级越高(先被创建)
2. 容器在创建好servlet对象之后,会立即调用该对象的init方法,初始化方法(init)只会执行一次。一般情况下,我们不用写init方法,因为GenericServlet已经提供了init方法的实现
实现过程:
将容器传递进来的ServletConfig对象保存下来,并且提供了一个getServletConfig方法来获得这个对象。
3. 初始化参数

company
xxxx

ServletConfig.getInitParameter(“company”);
4. 就绪状态会依据请求类型分别调用doGet或者doPost方法,可以
override HttpServlet的service方法 或 override HttpServlet的doGet/doPost

5.销毁
容器在删除servlet对象之前,会调用该对象的destroy方法,destroy方法只会执行1次,一般不需要写自己的destroy方法,GenericServlet已经提供了实现。

引入jsp技术
jsp:sun公司制订的一种服务器端动态页面技术规范。
因为使用servlet,虽然也可以生成动态页面,但是,过于繁琐(需要使用out.println语句),并且难以维护(修改页面,就需要修改java源代码),所以,sun公司才制订了jsp规范。
jsp其实就是一个以”.jsp”为后缀的文件,该文件的内容主要是html和少量的java代码。jsp文件会被容器转换成一个servlet然后执行,在tomcat的容器中有个work目录下就是jsp转换为servlet的临时目录,页面被编译为printwriter中输出。
jsp语法:
<% java代码 %>
<%= java表达式 %>
隐含对象:
session ,pagecontext,request,response等
导包:
<%@page import=”java.util.*”%>
<%@page import=”java.util.,java.text.“%>

servlet容器如何处理请求资源路径:
精确匹配:
要求的值必须是/abc.bcd。
通配符匹配:
使用”*”匹配0个或者多个字符。
/*
后缀匹配:
*.do

下面是以前我写的交友网站为例:
在web.xml使用*.do 后缀模糊匹配多个类是请求:checkcode是验证码的servlet

  <servlet>
    <servlet-name>ActionServlet</servlet-name>
    <servlet-class>web.ActionServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>CheckcodeServlet</servlet-name>
    <servlet-class>web.CheckcodeServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ActionServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>CheckcodeServlet</servlet-name>
    <url-pattern>/checkcode</url-pattern>
  </servlet-mapping>

截取uri请求地址路径:

String uri = request.getRequestURI();
String action = uri.substring(uri.lastIndexOf("/")+1,uri.lastIndexOf("."));

在jsp页面的form表单的action使用不同的请求地址:
把页面数据绑定到request上:
request.setAttribute(..,..);
绑定数据到页面

request.getRequestDispatcher("login.jsp")
                    .forward(request, response);

比如需要的使用删除后刷新,需要使用到重定向:

response.sendRedirect("login.jsp");

验证码页面代码:

<img id="img1" border="1" src="checkcode" onclick="this.src='checkcode?' + Math.random();"/>
<a href="javascript:;" onclick="document.getElementById('img1').src='checkcode?'+ Math.random();">看不清,换一个</a>

java:

package web;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CheckcodeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*
         * 一、绘图
         */
        /*
         * step1,创建一个内存映像对象(画布) BufferedImage(宽度,高度,类型)
         */
        BufferedImage image = new BufferedImage(80, 30,
                BufferedImage.TYPE_INT_RGB);
        /*
         * step2,获得一个画笔
         */
        Graphics g = image.getGraphics();
        /*
         * step3,给笔设置颜色
         */
        Random r = new Random();
        g.setColor(new Color(255, 255, 255));
        /*
         * step4,给画布设置背景颜色 fillRect(x,y,width,height)
         */
        g.fillRect(0, 0, 80, 30);
        /*
         * step5,绘图
         */
        g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
        // Font(字体,风格,大小)
        g.setFont(new Font(null, Font.ITALIC, 22));
        String number = getNumber(5);
        // 将number绑订到session对象上
        HttpSession session = request.getSession();
        session.setAttribute("number", number);
        // drawString(String,x,y) x,y是左下角的坐标
        g.drawString(number, 2, 23);
        // step6,加一些干扰线
        for (int i = 0; i < 12; i++) {
            g.drawLine(r.nextInt(80), r.nextInt(30), r.nextInt(80), r
                    .nextInt(30));
        }

        /*
         * 二、将图片压缩并发送给浏览器
         */
        // 设置content-type消息头,告诉
        // 浏览器返回的是图片
        response.setContentType("image/jpeg");
        // 一定要获得字节输出流
        OutputStream ops = response.getOutputStream();
        // write方法会对原始图片(image)按照
        // 指定的压缩算法(jpeg)进行压缩,并且
        // 将压缩之后的数据输出到指定的流(ops)。
        javax.imageio.ImageIO.write(image, "jpeg", ops);
        ops.close();
    }

    /*
     * 生成一个验证码,该验证码由"A~Z","0~9"中 随机选取5个字符组成
     */
    private String getNumber(int size) {
        String rs = "";
        String strs = "ABCDEFGHIJKLMNOPQ" + "RSTUVWXYZ0123456789";
        Random r = new Random();
        for (int i = 0; i < size; i++) {
            rs += strs.charAt(r.nextInt(strs.length()));
        }
        return rs;
    }

}

这里写图片描述
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

深入理解Servlet转发和重定向

一、转发     转发的原理,可以通过下图展示:     浏览器的请求发送给组件1,组件1经过一些处理之后,将request和response对象“传递”给组件2,由组件2继续处理,然后输出响...
  • kobejayandy
  • kobejayandy
  • 2013年10月31日 00:14
  • 7736

Servlet 实现重定向几种方法

servlet重定向 在servlet/JSP编程中,服务器端重定向可以通过下面两个方法来实现: 1,运用javax.servlet.RequestDispatcher接口的forward方...
  • qq_26975307
  • qq_26975307
  • 2017年01月04日 22:20
  • 1951

深入理解Servlet转发和重定向

一、转发     转发的原理,可以通过下图展示:     浏览器的请求发送给组件1,组件1经过一些处理之后,将request和response对象“传递”给组件2,由组件2继续处理,然后输出响...
  • kobejayandy
  • kobejayandy
  • 2013年10月31日 00:14
  • 7736

servlet请求转发的三种方式,请求转发与重定向以及包含

servlet请求转发的三种方式   servlet中的请求转发主要有三种方式: 1、  forward:是指转发,将当前request和response对象保存,交给指定的url处理。...
  • qq_33238935
  • qq_33238935
  • 2016年10月10日 19:41
  • 3777

servlet转发与重定向基本概念与区别

1.转发与重定向概念介绍1.1转发 浏览器的请求发送给组件1,组件1经过一些处理之后,将request和response对象“传递”给组件2,由组件2继续处理,然后输出响应(当然,也可以继续向其...
  • cuiyaoqiang
  • cuiyaoqiang
  • 2016年07月01日 09:29
  • 808

Servlet 转发 重定向说明与例子

请求转发        请求转发是指将请求再转发到另一资源(一般为JSP或Servlet)。此过程依然在同一个请求范围内,转发后浏览器地址栏内容不变        请求转发使用RequestDis...
  • fengqiujian
  • fengqiujian
  • 2015年09月15日 15:22
  • 1194

Servlet 请求转发和重定向

servlet请求转发与重定向
  • hxm_Code
  • hxm_Code
  • 2016年01月20日 13:49
  • 2001

Servlet中转发和重定向的路径问题以及表单提交路径问题

转自:http://blog.sina.com.cn/s/blog_7ffb8dd501013tbg.html 一、请求转发与响应重定向的种类    有两种方式获得Servlet转发对象(Re...
  • u011943172
  • u011943172
  • 2016年07月01日 16:27
  • 2274

Servlet 重定向原理

HttpServletResponse 对象的SendRequest(String location)方法称作重定向 重定向(sendRedirect)的工作原理:              客户发送...
  • kobejayandy
  • kobejayandy
  • 2013年10月30日 21:47
  • 2419

Servlet中转发或重定向后出现样式失效

问题:在Servlet中进行转发或者重定向后,跳转至目标页面(例index.jsp),但是页面的CSS和JavaScript样式失效,页面混乱...
  • u012187452
  • u012187452
  • 2017年03月02日 15:26
  • 1428
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Servlet基础使用完成转发和重定向
举报原因:
原因补充:

(最多只允许输入30个字)