Servlet总结1

什么是servlet
  • servlet是一门动态Web资源开发技术。
  • servlet本质上是一段java程序,但是与java不同的是,servlet不能独立运行,需要把它放在服务器中运行(tomcat)。
  • 其作用是处理服务器接收的请求
开发servlet程序
  • 继承关系:
    Servlet接口

    *--|GenericServlet抽象类
       **--|HttpServlet抽象类
           ***--|创建的servlet类
            

image.png


  • 创建servlet程序
package cn.wl;

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 ServletDemo extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
   
    public ServletDemo() {
        super();
        
    }

    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

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

}

可以使用以下格式:

package cn.wl;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * Servlet implementation class HelloServlet
 */
public class ServletDemo extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8"); // 设置中文
        PrintWriter out = response.getWriter();

    }

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

}

通过Eclipse创建的Servlet自动继承HttpServlet抽象类,而HttpServlet继承GenericServlet,GenericServlet继承Servlet接口,所以创建的Servlet实际上还是实现了Servlet接口。
继承HttpServlet类,默认会覆盖doGet和doPost方法。

  • servlet的配置web.xml文件
<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.tedu.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>

两个标签中的servlet-name标签的内容要一致,
< url-pattern>是配置服务器以什么路径访问当前的servlet


创建web程序
  • image.png
  • image.png
  • *注意: 3.0版本不会自动创建web.xml文件;选择2.5版本
web工程的目录结构
  • image.png
  • ServletDemo:是工程的名称
  • scr:是源码目录,创建java源文件,配置文件等
  • build/classes :编译文件的输出目录,src源码目录下的源代码编译后保存在此目录下。classes目录中的文件会在项目发布时存放在WEB-INF目录下,随着项目一起发布到服务器上。
  • WebContent: Web应用的目录,可以存放编译后的class文件、html、css、xml文件、lib依赖包等。项目的发布其实就是将WebContent中的内容发布到服务器上。
  • lib:存放当前项目所以来的jar包。

image.png

requestresponse

request和response介绍


request是代表HTTP请求信息的对象,response是代表HTTP响应信息的对象。

当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的service方法来处理请求。在调用service方法之前会创建出request和response对象。

其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。

每次浏览器访问服务器,服务器在调用service方法处理请求之前都会创建request和response对象。(即,服务器每次处理请求都会创建request和response对象)

在请求处理完,响应结束时,服务器会销毁request和response对象。
request对象
  • 请求参数
    *即浏览器发送给浏览器的数据,比如通过表单提交的账号,密码等。
  • 如何获取请求参数
request.getParameter(String pathname)
request.getParameters(String pathname) //获取一个数组
  • 如何解决获取请求参数时的乱码问题

(1)如果是GET提交,tomcat8.0以后不会有中文乱码
(2)如果是POST提交,都会有中文乱码
可以用下面代码:

request.setCharacterEncoding("utf-8");  //只对POST有效
请求转发
  • 请求转发是服务器内部的一种资源跳转方式,即当浏览器发出请求服务器的一个servlet A时,A将该请求转发给servlet B;由B处理后做出响应。
  • 请求转发和重定向都是资源跳转方式,只是跳转的过程不同。
  • Aservlet请求转发给Bservlet
package cn.wl.forward;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * Servlet implementation class HelloServlet
 * 请求转发
 */
public class AServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8"); // 设置中文
        PrintWriter out = response.getWriter();
        System.out.println("Aservlet.doGet.....");
        
        //从当前servlet转发到Bservlet
        //dispatcher 派遣
        request.getRequestDispatcher("BServlet").forward(request, response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

B

package cn.wl.forward;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sound.midi.Soundbank;

/**
 * Servlet implementation class HelloServlet
 */
public class BServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8"); // 设置中文
        PrintWriter out = response.getWriter();

        System.out.println("Bservlet.doGet。。。。");
        out.write("wdnmd"+new Date());
    }
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
  • 请求特点:
    *转发一次请求,一次响应
    *网页不跳转
    *能够携带资源
    *请求前后的两个资源必须在同一个服务器
request对象
获取请求参数
  • 什么是请求参数?
    *请求参数就是浏览器发送给服务器的参数,方式有GET、POST等。比如提交表单等。
    *格式如下:问号后面就是请求参数,使用&分开,可以是一个或多个;值或者是数组
http://loacalhost/day08-resreq/TestParam?name="张三"&age=12&interest="篮球"interest="足球"
  • 怎么获取请求参数?
//格式
request.getParameter(String paramName);
request.getParameterValues(String[] paramName);
package cn.wl;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

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

/**
 * Servlet implementation class HelloServlet
 */
public class TestParam extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8"); // 设置中文
        
        PrintWriter out = response.getWriter();

        /* 获取请求中的参数
         * (1)需要保证浏览器发送请求Servlet时,请求中有参数
         *  (2)request.getParameter(String name);根据参数获得参数的值,存在多个值,只返回第一个
         *  (2)request.getParameterValues(String name);            值数组
         */
        //获取请求中的username age
        String username = request.getParameter("username");
        String age = request.getParameter("age");
        System.out.println(username);
        System.out.println(age);
        String[] like = request.getParameterValues("like");
        System.out.println(Arrays.toString(like));
        
        out.write(username+"</br>");
        out.write(age+"</br>");
        out.write(Arrays.toString(like));
    }

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

}
解决获取请求参数时中文乱码的问题
  • 1.如果是GET请求,tomcat8.0以后就不会有中文乱码问题
  • 2.如果是POST请求,就一定会出现中文乱码问题

    • 解决方法:在接收POST提交的中文参数时,设置为utf-8
request.setCharacterEncoding("utf-8");
  • 3.如果是GET请求,并且tomcat是7.0以前的

    • 解决方法:
<Connector port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="utf-8" />
作用域

使用request对象携带数据时,就是通过request对象中的map集合带数据,这个request对象和request对象的共享区域就称作作用域,这个作用域中的数据可以共享。

//向作用域存数据
request.setAttribute(String attrName, Object attrValue);
// 取数据
request.getAttribute(String attrName);
作用域的三大特征
  • 1.生命周期:服务器在调用servlet中的service之前,会创建代表请求的request对象,在完成请求,响应结束以后,就会销毁request对象。
  • 作用范围:在一次请求的范围内,获取的都是同一个request对象。
  • 主要作用:和请求转发配合使用,将数据带到JSP(目的地)。
请求重定向
  • 重定向也是资源跳转跳转方式
  • 当浏览器向服务器发送获取请求资源A时,服务器通知浏览器需要再进一步请求才能获取资源,浏览器再次请求访问服务器中的资源B,最终由资源B响应浏览器要获取的资源,这就是重定向。
  • 重定向的特点
    *两次请求,两次响应
    *重定向前后,网址变化
    *不能携带数据
    *重定向的资源可以不是同一个web应用
response对象

reponse是HTTP响应信息的对象

向客户端发送信息的中文乱码

respons在向客户端发送信息时,默认的编码是iso8859-1,这个编码没有中文字符,所有需要我们手动的设置:

//通知服务器响应数据时,使用utf-8,并且通知浏览器在接收数据时,也使用utf-8
response.setContentType("text/html;charset=utf-8");
代码实现
response.sendRedirect(所重定向的到url资源地址);

A

package cn.wl.forward;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * Servlet implementation class HelloServlet
 * 重定向
 */
public class CServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8"); // 设置中文
        PrintWriter out = response.getWriter();
        
        System.out.println("CServlet.doGet()...的");
        //1.从当前Servlet重定向到DServlet
        //http://localhost:/day08-resreUJIq/CServlet
        //http://localhost:/day08-resreq/DServlet
//        response.sendRedirect("DServlet");
//        response.sendRedirect("http://localhost:/day08-resreq/DServlet");
        
        /*
         * 2.从当前的Servlet重定向到day08-servlet/text.html
         */
//        response.sendRedirect("http://localhost:/day08-servlet/test.html");
        
        /*
         * 3.从当前的Servlet重定向到百度
         */
        response.sendRedirect("http://www.baidu.com");

    }

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

}

B

package cn.wl.forward;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * Servlet implementation class HelloServlet
 */
public class DServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8"); // 设置中文
        PrintWriter out = response.getWriter();
        System.out.println("吗");
        
        out.write("我的");

    }

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

}
总结
请求转发和重定向的区别

1.请求转发是一次请求,一次响应;重定向是两次请求,两次响应
2.转发前后地址不变;重定向前后地址变
3.请求转发可以携带数据;重定向不可以
4.请求转发的两个资源必须在同一个web应用中;重定向可以不在


流浪成疯
7 声望3 粉丝

学习


引用和评论

0 条评论