程序员

JavaWeb-Servlet

2018-09-19  本文已影响10人  于无声处写写写

Servlet是和平台无关的服务器端组件,运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。

Servlet可完成的功能:

Tomcat就是Servlet容器

Servlet生命周期方法:

<load-on-startup>1</load-on-startup>
这个标签参数可以指定Servlet被创建的时机

ServletConfig:保存了Servlet的各项配置,并且可以获取ServletContex对象

ServletContext:


HTTP的会话方式:

Get请求和Post请求

Post方式传递参数

Java反射机制

获取字节码文件的方式

反射中获取私有属性

反射中获取私有方法

Servlet中的init()方法和destroy()方法

Servlet访问流程


image.png

init()方法参数介绍

public void init(ServletConfig servletConfig) throws ServletException {
}

servletConfig 可以获取一些配置信息
1.可以获取Servlet名称 web.xml
2.获取web.xml中的初始化参数
3.获取ServletContext

url-patten匹配形式

目录匹配
类似于导包时候的 .
*,只要在前面写好目录,不管具体的文件是什么,最终都能访问到目录下的servlet

url-patten缺省值与静态资源的访问流程

静态资源加载过程

使用注解创建Servlet
@WebServlet("/myServlet)

doGet()方法

doPost()方法

当一个Servlet类继承自HttpServlet时,如果复写了父类的Service方法,那么不管是通过post方式提交请求还是get方式提交请求,都会直接调用Service方法。即,一旦写了Service方法,就不会调用doPost和doGet方法。


image.png image.png

ServletContext对象

如何获得上下文


    @Override
    public void init(ServletConfig config) throws ServletException {
        ServletContext servletContext=config.getServletContext();
        System.out.println(servletContext);
    }

ServletContext 获取文件路径

ServletContext context=this.getServletContext();
String realPath =context.getRealPath("WEB-INF/b.txt");
System.out.println(realpath);

//使用类加载器,获取字节码的路径
//到字节码目录中加载资源

String path=OneServlet.class.getClassLoader().getResource("");
System.out.println(path);

ServletContext是一个域对象,是指能够存储数据

取数据

删除指定值

只要是一个域对象,里面都有这几个方法

Response对象
学习response主要就是学习通过response设置响应行,响应头,响应体

response响应过程:

设置响应行

设置响应头

response重定向

设置重定向
response.setHeader("location","另一个servlet");
另一种重定向方法
response.sendRedirect("另一个servlet");
定时刷新也是一种重定向
response.setHeader("refresh","另一个servlet")

设置响应体

默认情况下写的中文内容会乱码,因为写的内容在存到缓冲区中使用的是ISO8859编码,不支持中文。

如何解决中文乱码问题

在存之前设置存放的编码,response.setCharacterEncoding
告知浏览器使用的是utf-8编码
缓冲区及浏览器都有自己的编码格式,当更改了缓冲区编码方式仍然出现中文乱码时,应该更改浏览器的编码方式。

//设置缓冲区的编码格式
        resp.setCharacterEncoding("utf-8");
        //在响应中主动告诉浏览器通过什么样的编码格式接受
        resp.setHeader("Content-Type","text/html;charset=UTF-8");

上述两行代码可以通过如下一行代码替换

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

设置编码格式要在设置内容之前完成,

image.png image.png

getWrite()和outputstream不能同时存在。


下载文件

该方式不能识别出所有的文件类型,因此需要设置文件类型。


设置下载文件类型

  1. 设置mimeType
  2. 告诉浏览器以附件的形式打开
@WebServlet("/DownloadServlet2")
public class DownloadServlet2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String name=req.getParameter("filename");
        String path = this.getServletContext().getRealPath(name);
        System.out.println(path);

        String mimeType = this.getServletContext().getMimeType(name);
        //设置mimetype
        resp.setContentType(mimeType);
        //告诉浏览器以附件的形式打开
        resp.setHeader("Content-Disposition","attachment;filename="+name);
        //根据path加载文件

        FileInputStream in = new FileInputStream(path);
        ServletOutputStream servletOutputStream = resp.getOutputStream();
        byte[] buffer = new byte[1024];
        int len=0;
        while ((len=in.read(buffer))!=-1) {
            servletOutputStream.write(buffer);
        }
        in.close();
    }
    }


Request


image.png

请求头
1.获取所有请求头名称

Enumeration<String> headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements())
System.out.println("name="+headerNames.nextElements());

请求体
1.获取一个值
request.getParameterValue();
2.获取多个值
request.getParameterValues();
3.获取所有请求参数名称
request.getParameterNames();
4.获取所有请求参数
request.getParameterMap();


get和post方式如何选择
1.发送的参数不需要写到数据库用get方式
2.发送的参数需要保存到数据库用post


renquest请求转发
请求转发跟重定向的区别在于,请求转发是直接通过一个找另一个,不需要返回再重新找。


image.png

实现转发
1.通过请求对象获取一个转发器request.getRequestDispatcher(String path)
返回一个RequestDispatcher
2.通过转发器进行转发
调用转发器的forward()方法进行转发
disp.forward(req,rep)


image.png

request域对象
1.在一次请求过程当中存在的且共享


客户端地址与服务器端地址

cookie与Session

会话技术

什么是会话

解决什么问题

Session技术

Session域当一个浏览器访问服务器创建,关闭服务器或过期时,销毁Session域对象。
将数据存储到服务器,安全性相对好,增加服务器压力
会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说Sesssion的实现是基于Cookie。Session需要借助于Cookie存储客户的唯一性标识JSESSIONID。

获取Session对象

//方法内部判断该客户端是否在服务器端已经存在Session
//有则不创建,否则新创建session对象
HttpSession session=request.getSession();
String id=session.getId();

Session对象生命周期

创建:第一次执行request.getSession()时创建
销毁:

cookie技术

数据存储在客户端本地,减少服务器端压力,安全性不好,客户端可以清除cookie


image.png

服务器如何把cookie写给客户端

默认cookie的生命周期是会话级别,打开浏览器和关闭浏览器为一次会话,如果不设置持久化时间,cookie会存储在浏览器内存,浏览器关闭,cookie信息销毁

设置cookie的持久化时间需要在发送cookie之前进行。cookie.setMaxAge(60); 单位时间是秒,过期cookie自动销毁

删除cookie:创建一个重名的cookie,设置cookie的存活时间为0

服务器如何获取客户端携带的cookie

上一篇 下一篇

猜你喜欢

热点阅读