Servlet_1_基本知识

Servlet是一个接口,当一个类实现了此接口,便会被服务器识别。

在服务器收到客服端的请求后,会根据请求地址action,找到目标的servlet类进行响应。

 

 


一、请求与响应流程

1、客户端(浏览器)发起请求到服务器。

2、服务器接受请求,进行解析,创建request对象存储请求数据。

3、服务器调用对应的Servlet进行请求处理,并将request对象作为实参传递给Servlet的方法。

4、Servlet的方法对请求进行处理,并通过response对象将响应数据传给客服端。


二、Servlet类介绍

一个类继承了HttpServlet后,则成为一个Servlet服务。

1、Servlet常用方法:

  预处理,第一次被请求的时候,会先执行init方法。

    @Override
    public void init() throws ServletException {
        super.init();
    }

  服务器关闭的时候,会执行destory方法。

    @Override
    public void destroy() {
        super.destroy();
    }

  处理请求:

  1、doGet方法,只会处理get方式提交的请求。

  2、doPost方法,只会处理post方式提交的请求。

  3、service方法,会处理get或post提交方式的请求。(优先调用)

2、处理请求步骤

  (1)设置请求编码格式,如果是get方式,参考Servlet中设置请求和响应的编码格式

req.setCharacterEncoding("utf-8");

  (2)设置响应编码格式

resp.setContentType("text/html; charset=UTF-8");

  (3)获取请求信息,注意,获取不存在的name值不会报错,会取到null。

//获取表单中name值为u_name的值
String u_name = req.getParameter("u_name");
//获取表单中所有name值为favs的值的 String 对象数组
String u_pwd = req.getParameterValues("favs");

  (4)处理请求信息

      创建业务层对象

      调用业务层对象的方法

  (5)响应处理结果

      直接响应

      请求转发:把请求转发到指定的servlet去,此时的req对象为共享的,可以携带数据,通过set/getAttribute(key,value)

//把请求转发到指定servlet
req.getRequestDispatcher("Servlet别名").forward(req,resp);
return ;

      重定向:告知浏览器重发一个请求到指定的servlet

//为了避免servlet的别名中包含目录导致的使用先对路径查找资源失败
//建议使用绝对路径:/项目别名/资源路径
resp.sendRedirect("/项目别名/Servlet路径");
return

三、调用Servlet方式

客服端指定(action)对哪个servlet做出请求,则服务器调用目标servlet类进行处理请求。

1、默认开启的服务

  在项目的web.xml中,的对应的servlet标签中配置

<!--项目启动后第一个调用此服务-->
<load-on-startup>1</load-on-startup>

2、通过客服端请求开启的服务

  提交表单、超链接、......


四、请求数据的保存

1、保存在浏览器(Cookie)

将数据储存在cookie中,使其保存在浏览器中,案例:三天免登录。

新建:

//新建cookie对象
Cookie cookie = new Cookie("u_uid",""+u.getU_uid());
//设置有效期,秒数,三天,默认是关闭浏览器即失效
cookie.setMaxAge(3*24*60*60);
//设置有效路径,默认是项目下所有servlet
cookie.setPath("/servlet_war_exploded/ck");
//响应给浏览器
resp.addCookie(cookie);

获取:

//获取cookie信息数组
Cookie[] cookies = req.getCookies();
//遍历获取Cookie信息
if(cookies!=null){
       for (Cookie cookie:cookies){
           //获取键
           cookie.getName();
           //获取值
           cookie.getValue();
        }
}

2、保存在服务器中(session)

把请求信息保存在服务器的session对象中,浏览器通过cookie中的JSESSIONID进行访问,案例:同一个web应用中,用户的不同请求。

使用:

//如果请求中拥有session标识符JSESSIONID,则获取到对应的session对象。
//如果请求中没有JSESSIONID,则创建一个session对象,并把它作为cookie传递给浏览器。
//如果请求中的JSESSIONID已经失效,则新建一个session对象,并把它作为cookie传递给浏览器。
HttpSession hs = req.getSession();
//设置服务器中session储存时间(秒),一天,默认30分钟,可在web.xml中进行配置默认时间。 hs.setMaxInactiveInterval(24*60*60);
//销毁服务器中的session hs.invalidate();
//储存信息 hs.setAttribute("name","lurenjia"); //获取信息 hs.getAttribute("name");

五、ServletContext对象

它是由服务器创建的,所有用户共享的一个对象。(单例模式)

获取:

//获取方式一
ServletContext sc = this.getServletContext();
//获取方式二
ServletContext sc2 = req.getServletContext();
//获取方式三
ServletContext sc3 = this.getServletConfig().getServletContext();

1、数据共享:

  可以实现多用户数据共享。

//储存数据
sc.setAttribute("name","lurenjia");
//获取数据
sc.getAttribute("name");

2、获取项目web.xml中的param配置(全局)

  在web.xml中,给webapp标签添加子标签:

<context-param>
    <!---->
    <param-name>name</param-name>
    <!---->
    <param-value>name_lurenjia</param-value>>
</context-param>

  使用ServletContext获取

//通过键名获取值
String value = sc.getInitParameter("name");

//获取键名,迭代器对象
Enumeration<String> names = sc.getInitParameterNames();
//遍历值
while (names.hasMoreElements()){
    System.out.println(sc.getInitParameter(names.nextElement()));
}

3、获取项目根目录下资源的绝对路径

//获取项目根目录下的资源路径
String path = sc.getRealPath("/doc/1.txt");

4、获取项目根目录下资源的流对象

//获取项目根目录下的资源的流对象
InputStream is = sc.getResourceAsStream("/doc/1.txt");

六、ServletConfig对象

每个Servlet对象都单独拥有一个ServletConfig对象,用来获取web.xml中自己的param配置。

  1、xml中,给servlet标签配置子标签

<init-param>
    <param-name>love</param-name>
    <param-value>is you</param-value>
</init-param>

  2、使用ServletConfig获取

//通过键名获取值
String value = sc.getInitParameter("name");

//获取键名,迭代器对象
Enumeration<String> names = sc.getInitParameterNames();
//遍历值
while (names.hasMoreElements()){
    System.out.println(sc.getInitParameter(names.nextElement()));
}

 

posted @ 2023-02-08 20:38  在博客做笔记的路人甲  阅读(39)  评论(0编辑  收藏  举报