Servlet相关

一 请求对象和响应对象

1.1 HttpServletRequest(请求对象)

1.1.1 获取请求数据

public class requestDemo extends Servlet
{
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   //1.请求行
   request.getMethod();//请求方式
   request.getRequestURI();//请求资源
   request.getRequestURL();//请求的URL
   //2.请求头
   request.getHeader("Host");//根据头名称得到头内容
   request.getHeaderNames();//得到所有的请求头名称列表
   //3.保存数据   request是个域对象
   request.setAttribute("name",Object obj);
   request.getAttribute("name");
 }

 public void doPost(HttpServletRequest request, HttpServletResponse resp) throws servletException, IOException{

    //请求实体内容
   InputStream is = request.getInputStream();//只有post请求才有实体内容

 }

}

1.1.2 获取Get和Post方式提交的参数

public class requestDemo1 extends Servlet
{
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

   request.getParameter("name");//根据参数名获取参数值
   request.getParameterNames();//获取所有的参数名
   request.getParameterValues("hobit");//获取一个参数名对应多个值的参数值

 }

 public void doPost(HttpServletRequest request, HttpServletResponse resp) throws servletException, IOException{

     doGet(request,resp);
 }

}

1.1.3 编码问题

如果客户端把字符串通过不是iso-8859-1的编码方式进行了编码后发给服务器,而服务器默认的解码方式是iso-8859-1,就会出现编码问题。

public class requestDemo2 extends Servlet
{
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  String name =  request.getParameter("name");//根据参数名获取参数值

   if("GET".equals(request.getMethod()))
   {
    name =new String(name.getBytes(),"utf-8"); //Get请求的编码问题解决方案
   }
 }

 public void doPost(HttpServletRequest request, HttpServletResponse resp) throws servletException, IOException{
  //设置参数编码  这个方法只对Post有效,对Get无效,要放在第一行
  request.setCharacterEncoding("utf-8");
   doGet(request,resp);
 }
}
1.2 响应对象(HttpServletResponse)
public class responseDemo extends Servlet
{
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   //可以设置响应头
   response.setHeader("server","JBoss");
   //响应的实体内容
   response.getWriter().write("hello world");//字符内容
   response.getOutputStream().write("hello world".getBytes());//字节内容
   //设置请求重定向
   response.sendRedirect("/it/test.html");
   //定时刷新
   response.setHeader("refresh","1");每隔1秒刷新一下当前页面
   response.setHeader("refresh","3;url=/it/test.html");//隔三秒之后跳转到另外的资源
   //服务器发送给客户端的数据类型和实体内容编码 但是要放在第一行
   response.setContentType("text/html;charset=utf-8");
   //response.setContentType("image/*"); 图片的格式类型
   //设置以下载的方式打开文件
   response.setHeader("Content-Disposition","attachment;filename="+"文件名称");

 }
}

二 Servlet生命周期

public class ServletLife extends HttpServlet {

 // 1.调用构造方法
  public ServletLife ()
  {
  }
// 2.调用init方法 只会调用一次
  public void init()
  {
  }
  // 3.调用service方法  每次请求都会调用一次
  public void service(ServletConfig config)
  {
  }
  //4. 调用Destory方法  重新部署或者停止服务器时调用
  public void destory()
  {
  }

}

生命周期:

  1. 通过映射找到web.xml中servlet-class的内容,字符串:”servlet.ServletLife “。
  2. 通过反射构造ServletLife 对象
    Class clazz = class.forName(“servlet.ServletLife”);—-得到字节码对象
    Object obj = clazz.newInstance();——调用了构造方法

  3. 创建ServletConfig对象,通过反射调用init方法
    Method m = clazz.getDeclareMethod(“init”,ServletConfig.class);—得到方法对象
    m.invoke(obj,config);—-调用了init方法

  4. 创建request,response对象,通过反射调用service方法
    Method m = clazz.getDeclareMethod(“service”,HttpServletRequest.class,HttpServletResponse.class);—得到service方法对象
    m.invoke(obj,request,response);—–调用service方法
  5. 重新部署或者停止服务器时调用destory方法
    Method m = clazz.getDeclareMethod(“destory”,null);—得到destory方法
    m.invoke(obj,null);—-调用方法

三 Servlet使用小技巧

3.1 init方法
无参数的init方法是用来编写servlet初始化时要执行的逻辑代码。

3.2 提前加载servlet对象
如果init方法中的逻辑代码比较复杂,用户第一次访问servlet的时候会比较慢,可以把servlet的创建时机提前到web.xml加载的时候。

方法:在servlet的web.xml配置信息中,加上一个”load-on-startup”标签

  <servlet>
    <servlet-name>LifeDemo</servlet-name>
    <servlet-class>c_life.LifeDemo</servlet-class>
    <!-- 让servlet对象自动加载 -->
    <load-on-startup>1</load-on-startup>  注意: 整数值越大,创建优先级越低!!
  </servlet>

四 ServletConfig对象和ServletContext对象

4.1 ServletConfig

作用:主要用于加载servlet的初始化参数。

获取到ServletConfig对象:this.getServletConfig();

初始化参数配置在web.xml中

<servlet>
    <servlet-name>ConfigDemo</servlet-name>
    <servlet-class>f_config.ConfigDemo</servlet-class>
    <!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
    <init-param>
        <param-name>path</param-name>
        <param-value>e:/b.txt</param-value>
    </init-param>
  </servlet>

ServletConfig的API:

 getInitParameter(java.lang.String name) //根据参数名获取参数值
 getInitParameterNames() //获取所有参数
 getServletContext()  //得到servlet上下文对象

4.2 ServletContext(域对象)

ServletContext表示的是整个web应用的上下文,就是把应用的web.xml文件中的内容封装成了ServletContext对象。

得到方法:this.getServletContext();

获取web应用路径:

 getContextPath();//获取到web应用的路径 重定向的时候用的多

获取web应用全局参数 要在web.xml中配置

 getInitParameter(String name);//根据参数名获取参数值  web应用参数可以让当前web应用的所有servlet获取
 getInitParameterNames()

保存数据和取出数据,可以在不同的servlet之间共享数据

 setAttribute(String name,Object object);//保存数据
 getAttribute(String name);//获取数据
 removeAttribute(String name);//删除数据

转发—-不能转发当前web应用以外的资源

RequestDispatcher rd = this.getServletContext().getRequestDispatcher(String path);//用于跳转页面
rd.forward(request,response); 

五 Web应用中路径问题

无论是web项目还是java项目(new File(“.”))中的“.”都是代表的java命令的运行目录。

5.1 转发或跳转资源路径确认

确认路径要先确认目标文件是给谁用的:

  1. 服务器使用:“/”表示在当前web应用的根目录(webRoot下)
  2. 浏览器/客户端使用:“/”表示在Tomcat文件中的webapps的根目录下

示例:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//目标资源:target.html放在WebRoot文件下面
//1.转发(服务器使用)
request.getRequestDispatcher("/target.html").forward(request,response);
//2.重定向(浏览器使用)
response.sendRedirect("/day11/target.html");      
}

5.2 web应用中加载资源文件路径

getRealPath();返回资源文件的绝对路径

示例:

// db.properties文件放在项目的src文件夹下面
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");//第一个"/"代表项目根目录下

六 会话技术(Cookie和Session)

6.1 Cookie
特点:会话数据保存在浏览器客户端,主要作用是存储数据。

常用方法:

new Cookie(java.lang.String name, java.lang.String value);//创建一个cookie对象
void setPath(java.lang.String uri); //设置cookie的有效访问路径

void setMaxAge(int expiry) ;//设置cookie的有效时间   正数:cookie数据保存在浏览器硬盘中的时间   负数:cookie数据保存在浏览器内存中的时间   0:删除同名cookie
response.addCookie(Cookie cookie); //发送cookie到浏览器
request.getCookies();// 服务器接收cookie

注意:Cookie保存的数据类型只能是非中文字符串,一个站点最多存放20个cookie。

6.2 Session(HttpSession)—域对象

特点:会话数据保存在服务端。

常用方法:

request.getSession();//获取session对象
request.getSession(boolean create);//获取session对象
setMaxInactiveInterval(int interval);//设置session有效时间
invalidate();//销毁session对象
getId();//得到session编号
setAttribute(String name,Object value);//保存数据
getAttribute(String name);//获取数据
removeAttribute(String name);//清除数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet是Java Web应用程序中的一种Java类,用于处理Web请求和响应。Servlet可以接收HTTP请求并生成HTTP响应。Servlet通常用于构建动态Web应用程序,如Web表单处理、用户身份验证、网站搜索等。 以下是一些Servlet相关理论: 1. Servlet生命周期:Servlet的生命周期包括初始化、服务和销毁三个阶段。当Servlet容器第一次加载Servlet时,它会调用init()方法对Servlet进行初始化。当Servlet容器接收到一个请求时,它会调用service()方法来处理请求。当Servlet容器关闭时,它会调用destroy()方法来销毁Servlet。 2. Servlet API:Servlet API是一组Java类和接口,它定义了Servlet容器和Servlet之间的通信规范。Servlet API包括HttpServletRequest、HttpServletResponse、ServletContext等类和接口。 3. Servlet容器:Servlet容器是Web服务器或应用服务器中的一个组件,它负责管理Servlet的生命周期并提供Servlet运行环境。常见的Servlet容器包括Tomcat、Jetty、WebLogic等。 4. Servlet配置:Servlet可以在web.xml文件中配置。web.xml文件是一个XML文档,它包含Servlet和其他Web应用程序组件的配置信息。 5. Servlet过滤器:Servlet过滤器是一种能够拦截和处理请求的Java类。Servlet过滤器可以用于身份验证、日志记录、压缩、加密等任务。 6. Servlet会话管理:Servlet可以使用会话来跟踪用户在Web应用程序中的状态。会话是一种将数据存储在服务器端的机制,它可以用于跨页面传递数据、用户身份验证等任务。 以上是一些Servlet相关理论。理解这些概念可以帮助开发人员更好地理解和使用Servlet技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值