Servlet小结
阅读原文时间:2023年07月08日阅读:2

1.sevlet的生命周期

用户在发送第一次请求的时候Servlet对象被实例化(AServlet的构造方法被执行了。并且执行的是无参数构造方法。)

AServlet对象被创建出来之后,Tomcat服务器马上调用了AServlet对象的init方法。(init方法在执行的时候,AServlet对象已经存在了。已经被创建出来了。)

用户发送第一次请求的时候,init方法执行之后,Tomcat服务器马上调用AServlet对象的service方法。之后每发送一次请求,都调用一次service方法

destroy方法在服务器关闭的时候被调用,只调用一次

2.GenericServlet、ServletConfig、ServletContext

GenericServlet是一个适配器(不算常用)

ServletConfig保存配置信息,一个Servlet对应一个ServletConfig对象。

ServletContext对象通常对应的是一个web.xml文件,是应用级对象。数据量小、所有用户共享、又不修改,这样的数据放到ServletContext这个应用域当中,会大大提升效率。其中setAttribute、getAttribute、removeAttribute方法用来存放,取出,删除数据。

public class ConfigTest extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        servletResponse.setContentType("text/html");
        PrintWriter pw=servletResponse.getWriter();

        Enumeration<String> names=this.getInitParameterNames();  //获取name集合

        while(names.hasMoreElements()){

            String pn=names.nextElement();//取元素
            String values=this.getInitParameter(pn); //获取values
            pw.print(pn);
            pw.println(values);

        }

        //获取servletcontext对象
        ServletContext application=  this.getServletContext();
        ServletContext application2=  this.getServletContext();
        pw.print(application);  //@514f4874
        pw.print(application);  //@514f4874
    }

3.GET与POST区别

get请求比较适合从服务器端获取数据。

post请求比较适合向服务器端传送数据。

get请求是安全的。get请求是绝对安全的。

get请求发送数据的时候,数据会挂在URI的后面,并且在URI后面添加一个“?”,"?"后面是数据。这样会导致发送的数据回显在浏览器的地址栏上。(get请求在“请求行”上发送数据)

post请求发送数据的时候,在请求体当中发送。不会回显到浏览器的地址栏上。也就是说post发送的数据,在浏览器地址栏上看不到。(post在“请求体”当中发送数据)

4.HttpServlet与欢迎页面

我们编写的HelloServlet直接继承HttpServlet,直接重写HttpServlet类中的service()方法行吗?

可以,只不过你享受不到405错误。享受不到HTTP协议专属的东西。

怎么设置欢迎页面,打开web.xml

<welcome-file-list>
        <welcome-file>login.html</welcome-file>
    </welcome-file-list>

注意:设置欢迎页面的时候,这个路径不需要以“/”开始。并且这个路径默认是从webapp的根下开始查找。一个webapp是可以设置多个欢迎页面的。越靠上的优先级越高。找不到的继续向下找。

5.HttpServletRequest

request对象和response对象,一个是请求对象,一个是响应对象。这两个对象只在当前请求中有效。

怎么获取前端浏览器用户提交的数据?

Map<String,String[]> getParameterMap() 这个是获取Map
Enumeration<String> getParameterNames() 这个是获取Map集合中所有的key
String[] getParameterValues(String name) 根据key获取Map集合的value
String getParameter(String name)  获取value这个一维数组当中的第一个元素。这个方法最常用。


public class RequestTest extends HttpServlet {

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    Enumeration<String> er= req.getParameterNames();
    while(er.hasMoreElements()){
        String name=er.nextElement();
        System.out.println(name+"="+req.getParameter(name));//只能接受一个

    }
        System.out.println("=========方式二============");
    //方式二
String[] name=req.getParameterValues("username");
String []password=req.getParameterValues("userpassword");
String[] hobby=req.getParameterValues("userhobby");
        for (String s:name
             ) {
            System.out.println(s);
        }
        for (String s:password
        ) {
            System.out.println(s);
        }
        for (String s:hobby
        ) {
            System.out.println(s);
        }
        System.out.println("=========方式三==========");
        //最常用方法  只能输出一个,但是复选框可以使用getParameterValues
        String s=req.getParameter("username");
        String s1=req.getParameter("userpassword");
        String[] s2=req.getParameterValues("userhobby");
        System.out.println(s+"  "+s1+"  ");
        for (String  shobby:s2
        ) {
            System.out.println(shobby);
        }
       /*  以下方法返回一个一位数组,输出tostring方法
       System.out.println(req.getParameterValues("username"));
        System.out.println(req.getParameterValues("userpassword"));
        System.out.println(req.getParameterValues("userhobby"));
        */
    }


输出:
username=admin
userpassword=admin
userhobby=read
=========方式二============
admin
admin
read
run
=========方式三==========
admin  admin
read
run

转发机制:

request.getRequestDispatcher("/b").forward(request,response);