JavaEE总结(5)——Servlet

Servlet概述

Servlet 是运行在 Web 服务器中的小型 Java 程序。Servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。

Servlet实现

1. 定义类,实现servlet接口或者继承GenericServlet或者继承HTTPServlet

2. 在web.xml中针对实现的servlet进行配置

3. 浏览器上访问servlet

Servlet :接口

   |

GenericServlet :通用的Servlet

   |

HttpServlet :HttpServlet

实现servlet接口

public class ServletDemo1 implements Servlet{

@Override

/**

 * 为用户处理请求和响应的方法.

 */

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

res.getWriter().println("Hello Servlet...");

}

...

}

web.xml中配置servlet

    test1

    

    com.itsource.servlet.ServletDemo1

  

  

  

  

  

   test1

  

   /ServletDemo1

  

访问servlet

http://localhost:8080/demo/ServletDemo1

Servlet生命周期

Servlet生命周期:Servlet程序从创建到销毁的过程

1:init方法创建Servlet

2: 调用service方法启动服务

3: 关闭服务,destroy方法

ServletConfig

ServletConfig是servlet 容器使用的 servlet 配置对象,该对象在初始化期间将信息传递给servlet。

API

String getInitParameter(String name)

返回根据web.xml中配置的参数名获取参数值

Enumeration getInitParameterNames()

获取配置的所有参数名称,返回为一个Enumeration对象

String getServletName()

获取Servlet名称

ServletContext getServletContext()

返回一个ServletContext对象用于服务器和Servlet程序之间交互时使用的对象,该对象

在服务器启动时就存在

Tomcat7接收数据乱码

req.getParameter(“name”).getBytes(“ISO-8859-1”);

HttpServletResponse

HttpServletResponse是ServletResponse接口的子接口,表示HTTP协议的响应对象。既然HttpServletResPonse是HTTP的响应对象,那么该接口中包含了针对各自请求进行响应的方法。响应无非就是将数据输出到客户端,在IO中流的输出无非就是两种:字节输出流和字符输出流。

Servlet实现

 

Servlet :接口

   |

GenericServlet :通用的Servlet

   |

HttpServlet :HttpServlet

 

Servlet的注解:

修改web.xml中metadata-complete修改为false

@WebServlet("/路径")

web.xml中配置servlet

    test1

    

    com.itsource.servlet.ServletDemo1

  

  

  

  

  

   test1

  

   /ServletDemo1

  

WEB不同之间传值:

1.GET方式提交数据

ip:端口/项目名/访问路径?参数=值&参数2=值

自定义GET方式去提交数据

2.Cookie:浏览器上的

一个服务器最多在浏览器上能存储20个

浏览器总共能存储300个cookie

 

cookie中不能存储对象,只能存储字符串,而且中文字符串不能直接被存储

URLEncoder.encode(数据,UTF-8)

URLDecoder.decode(数据,UTF-8)

 

cookie定义一个路径和名称:

1.浏览器中根据路径和名称来确定cookie文件是否是一个

2.在代码中读取cookie的数据的时,根据cookie定义的路径决定的

/项目名/ServletA

/项目名

 

需求:给浏览器添加一个cookie

问题:cookie是在浏览器,添加的代码在服务器

响应对象

 

需求:从浏览器中读取cookie的数据

请求对象.getCookies,返回一个Cookie[]

 

获取cookie的信息【名称、路径、值】

Cookie再总结一次

 

Servlet功能

1.servlet三大职责(每次写Servlet的时间都要先想一下这三大职责)

 ①:接收与封装参数

 ②:处理业务(一些会去调用service层)

 ③:跳转页面(最后都会跳转到jsp页面显示数据)

2.什么我们需要跳转与数据共享 ★★★

跳转:需要做责任分离(Servlet擅长写代码,jsp擅长展示页面)

共享:http是无状态的,我们跳转的时候数据无法保存下来.因此需要做数据共享

3.Servlet跳转的三种方式

举一个例子:创建两个Servlet,分别叫AServlet与BServlet.

然后我访问AServlet,从AServlet跳转到BServlet

3.1 请求转发 Forward ★★★

/**

 * req.getRequestDispatcher(String path)

 * 拿到转发器/确认跳转的地址

 * forward:进行跳转

 */

req.getRequestDispatcher("/forward/b").forward(req, resp);

注意:千万不要忘了写forward

请求转发的特点:

①:地址栏不变

②:只发送了一次请求

③:共享一个请求头(request)

怎么看到的:传了一个参数,在两个Servlet中都可以拿到

④:最后一个响应才起作用

   请求的顺序:自己看一下图

⑤:不可以跨域访问(不要直接去跳转到其它网站)

⑥:可以访问WEB-INF里面的数据

 

3.2 重定向 Redirect ★★★

//直接跳转 -> 有点像我们直接在地址栏输入一个新的地址

resp.sendRedirect("/redirect/b");

重定向的特点:

①:地址栏会变化

②:每次跳转都会发送一个新的请求

③:请求头不共享

  • :显示的依然是最后一个
  • :可以跨域的
  • :不可以访问WEB-INF里面的数据

域对象

四大作用域

做数据共享的时候,我们把数据放在不同的地方

类                  名称

PageContext          page            当前页(作用不大)

HttpRequest          request         一次请求

HttpSession        session         一次会话(已经学过了)

ServletContext     application    整个应用(有且只有一个对象)

解释:

pageContext:

每次访问的时候创建,可以有多个

Request:

每次请求的时候创建,可以有多个

Session:

每次会话的时候创建,不同人打开不同的浏览器,就创建多个,可以有个多个

Application:

整个应用有且只有一个对象,服务器启动就创建,关闭的时候销毁

该对象可以通过ServletConfig、Servlet、Request、Session获取到

域对象学习:

怎么把我们要共享的数据放到作用域里面?

作用域对象.setAttribute(String name,Object value);

 

怎么从作用域中拿到共享后的数据?

作用域对象.getAttribute(String name);

 

怎么从作用域中把数据删除?

作用域对象.removeAttribute(String name);

 

注意:每个作用域有自己的范围.

 我们的数据放在哪一个作用域里面, 就必需到这一个作用域里面去拿数据!

普及:

什么时候,我们选择使用哪一个作用域?

Session只用于登录,保存当前登录的用户!!

Request我们平时从数据库拿到数据的展示都全用Request!!

Application一般会用到统计当前登录用户的数量上(现在都不用)

ServletContext对象

拿到ServletContext对象

//第一种方式(父类提供方法)

ServletContext  sc1 = super.getServletContext();

//第二种方式(从ServletConfig中拿到)

ServletContext  

sc2 = super.getServletConfig().getServletContext();

//第三种方式(从request中拿到)

ServletContext  sc3 = req.getServletContext();

//第四种方式(从session中拿到)

ServletContext  sc4 = req.getSession().getServletContext();

用哪个:能用哪个用哪个. 选简单的

 ServletContext的方法

getContextPath : 拿到上下文路径

getRealPath : 拿到项目的真实路径

------------------------------------------

getInitParameter("encoding") : 拿到全局的初始参数

这个初始参数在哪:由我们在web.xml中进行配置

 

encoding

UTF-8

 

你可能感兴趣的:(Java,JavaEE)