2022-08-30 第六小组 张宁杰 servlet

servlet初始化的方法

init()

默认当我们第一次访问servlet的时候被调用,延迟加载。初始化方法只执行一次。

@Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("servlet初始化...");
        System.out.println(config.getInitParameter("username"));
        System.out.println(config.getInitParameter("password"));
    }

doGet()和doPost()

方法形参含义

HttpServletRequest--request(请求)

所有和请求相关的操作,都用这个对象来处理,当有请求来的时候,request就被实例化。

HttpServletResponse--response(响应)

所有和响应相关的操作,都用这个对象来处理,当有请求来的时候,response就被实例化。当想要给出响应时,使用response,我们要给出的响应,必须要展示在客户端(浏览器)

重写方法注意事项

 @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 给出响应
        // 客户端和服务器端的信息传递

        // 设置响应的字符集
        // 一定要放在获取流之前
        // 服务器处理字符串按照UTF-8处理
        response.setCharacterEncoding("utf-8");
        // 添加响应头,告诉浏览器以HTML的格式来解析响应字符串
        response.addHeader("content-type","text/html;charset=utf-8");

        // IO流
        PrintWriter out = response.getWriter();
        // 向客户端回复的数据
        out.write("我是后台,已经接到了你的请求!!!");

        // 流的操作
        out.flush();
        out.close();
    }

客户端传参的方式

get,post
浏览器地址栏直接输入:一定是get请求
超级链接:一定是get请求
表单:可以是get,也可以是post,取决于method

GET请求和POST请求的区别:

GET:请求的参数会在浏览器的地址栏中显示,不安全;请求的长度限制在1K之内。没有请求体,无法通过request去设置一些参数。
POST:请求的参数不会在浏览器的地址栏中显示,相对安全。把请求的参数封装成几个数据报文(请求体)。请求参数的长度没有限制。

request

request.getParameter("")

根据key获取对应的value

request.getParameterValues("")

获取一个key对应的多个值,返回值为String类型的数组

String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));

request.getParameterNames()

获取请求中传过来的参数的key值,根据key值获取对应的value值

Enumeration<String> parameterNames = request.getParameterNames();
        while(parameterNames.hasMoreElements()){
            System.out.println(parameterNames.nextElement());
        }

request.getParameterMap()

可以获取到请求中的所有的键值对,返回值是一个map集合,这个map集合的key是String,value是String[].
username=admin,password=123456,hobby=a,b,c,gender=man

Map<String, String[]> map = request.getParameterMap();
        for (Map.Entry<String, String[]> name : map.entrySet()) {
            String key = name.getKey();
            String[] value = name.getValue();
            System.out.println(key + "--->" + Arrays.toString(value));
        }

请求转发(面试题)

请求转发是在服务器上完成的,跟客户端是否无关!!!

String name = request.getParameter("name");
        System.out.println("Demo02Servlet,name:" + name);
        getRequestDispatcher参数:转发的servlet的地址
        forward参数:request,response,把当前servlet用的request和response传给下一个
        request.getRequestDispatcher("demo03.do").forward(request,response);

作用域

demo04

@WebServlet("/demo04.do")
public class Demo04Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
        * 作用域:起作用的区域
        *
        * 往request作用域中添加了一个属性name,值是zhangsan
        *
        * 请求转发的时候是同一个request
        *
        */
        request.setAttribute("name","zhangsan");
        // name怎么取出来?
        System.out.println("demo04.do---name:" + request.getAttribute("name"));
        request.getRequestDispatcher("demo05.do").forward(request,response);

//        根据指定的key,删除对应的value
//        request.removeAttribute("name");
        // 获取request作用域中的所有的key
//        Enumeration<String> attributeNames = request.getAttributeNames();


    }

demo05

@WebServlet("/demo05.do")
public class Demo05Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo05.do---name:" + request.getAttribute("name"));
    }

request.removeAttribute("")

根据指定的key,删除对应的value

request.getAttributeNames()

获取request作用域中的所有的key

Enumeration<String> attributeNames = request.getAttributeNames();

response

response.getWriter()

response.setCharacterEncoding("utf-8")

response.addHeader("content-type","text/html;charset=utf-8")

response.sendRedirect("success.html")

重定向

请求转发和重定向的区别:

1.重定向是两次请求,请求转发是一个请求
2.重定向是客户端行为,请求转发是服务器行为
3.重定向浏览器地址会发生改变,转发不会
== 4.重定向可以定向到任意地址,转发只能项目内转发==

零碎知识点

out.write---写字符。out.print---写字节。
login.do
用来描述即将做的事

posted @ 2022-08-30 22:23  贵妃就是贵妃  阅读(21)  评论(0编辑  收藏  举报