2020-11-16

Servlet

1.Http协议

请求协议:客户端发送给服务端

响应协议:服务器发送给可客服端

1.1特点

简单快速,灵活,无连接,无状态

1.2URL

格式

http://host[:prot]/[abc_path]
http://IP(主机名/域名):端⼝/访问的资源路径
https://www.baidu.com

http:表示通过协议来定位网络资源

host:表示合法的主机域名或者ip地址

port:指定一个端口号,为空则默认为80

abs_path:指定请求资源的url

2.Servlet实现

运行在服务器端,由服务器调用

2.1实现Servlet规范

继承于HttpServlet类,重写 service方法

public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("你好!!!");
        resp.getWriter().write("Hello!");

    }
}
2.2设置注解

使⽤@WebServlet定义资源名称

@WebServlet("/hello")
2.3访问路径
http://localhost:8080/[tomcat资源名]/[类资源名]
2.4工作流程

①: 通过请求头获知浏览器访问的是哪个主机

②:再通过请求⾏获取访问的是哪个⼀个web应⽤

③:再通过请求⾏中的请求路径获知访问的是哪个资源

④:通过获取的资源路径在配置中匹配到真实的路径,

⑤:服务器会创建servlet对象,(如果是第⼀次访问时,创建servlet实例,并调⽤init⽅法 进⾏初始化 操作)

⑥: 调⽤service(request, response)⽅法来处理请求和响应的操作

⑦:调⽤service完毕后返回服务器 由服务器讲response缓冲区的数据取出,以http响应的 格式发送给 浏览器

2.5生命周期

Servlet没有 main()⽅法,不能独⽴运⾏,它的运⾏完全由 Servlet 引擎来控制和调度。

①:实例和初始化

init方法:在 Servlet 实例创建之后执⾏

 //初始化,只执行一次
    @Override
    public void init(){
        System.out.println("实例创建了");
    }

②:就绪/调⽤/服务阶段

service ⽅法,每次有请求到达某个 Servlet ⽅法时执⾏,⽤来处理请求

@Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("你好!!!");
        resp.getWriter().write("Hello!!!");
    }

③:销毁时机

destroy ⽅法,Servlet 实例销毁时执⾏

//销毁,只执行一次
    @Override
    public void destroy(){
        System.out.println("实例销毁了!");
    }
3. HttpServletRequest对象

用于接收客户端发送过来的请求消息

3.1常用方法
//获取完整的URL
StringBuffer url = req.getRequestURL();
System.out.println("URL->"+url);
//获取项目名称以后的资源名称
String uri = req.getRequestURI();
System.out.println("URI->"+uri);
//获取请求行中的参数
String query = req.getQueryString();
System.out.println("Query->"+query);
//获取客户端的请求方式
String method = req.getMethod();
System.out.println("MEthod->"+method);
//获取HTTP版本号
String protocol = req.getProtocol();
System.out.println("Protocol->"+protocol);
//获取Webapp站点名称
String path = req.getContextPath();
System.out.println("Path->"+path);

获取请求的参数

//获取请求参数
//String uname = req.getParameter("uname");
String[] values = req.getParameterValues("uname");
System.out.println(Arrays.toString(values));
3.2请求乱码问题

方法一:

request.setCharacterEncoding("UTF-8");

方法二:

new String(req.getParameter("uname").getBytes("ISO-8859-1"), "utf-8");
3.3请求转发

服务器行为。从始至终只有一个请求发出,URL栏地址不会发生变化

req.getRequestDispatcher(url).forward(req,resp);
3.4request作用域
// 设置域对象内容
request.setAttribute(String name, String value);
// 获取域对象内容
request.getAttribute(String name);
// 删除域对象内容
request.removeAttribute(String name);
4. HttpServletResponse对象

用于服务器端对客户端进行请求响应

4.1响应数据

getWriter():获取字符流(只能响应回字符)

PrintWriter writer = resp.getWriter();
writer.write("Hello!!!");
writer.write("<h2>嘻嘻哈哈</h2>");
writer.flush();
writer.close();

getOutputStream():获取字节流(能响应一切数据)

ServletOutputStream os = resp.getOutputStream();
os.write("你好".getBytes());
os.write("<h2>嘻嘻哈哈</h2>".getBytes());
os.flush();
os.close();

响应HTML类型

response.setHeader("content-type","text/html");
4.2响应乱码问题
getWriter()的字符乱码

设置服务器使用一种能支持中文编码格式

resp.setCharacterEncoding("UTF-8");

还需指定客户端格式

response.setHeader("content-type", "text/html;charset=UTF-8");
getOutputStream()字节乱码

指定客户端和服务器使⽤的编码⽅式⼀致。

response.setHeader("content-type","text/html;charset=UTF-8");
// 设置客户端与服务端的编码
response.setContentType("text/html;charset=UTF-8");
4.3重定向

客户端发出第一个请求,被服务器处理后,服务器会响应,相应的同时给客户端一个新地址

sendRedirect()

//重定向到login.jsp页面
resp.sendRedirect("login.jsp");
4.4请求转发和重定向的区别

请求转发:一次请求。服务器端行为。地址栏不发生变化。绝对地址定位到资源后

重定向: 两次请求。 客户端行为。地址栏会发生变化。绝对地址可写到http://

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值