Java Web:Servlet

Servlet

  • 概念:运行在服务器的小程序
    1. 本质上是一个接口:里面有5个方法
    2. 定义了 Java类被浏览器访问到(tomcat识别)的规则
  • 快速入门:
    1. 创建JavaEE项目
    2. 定义一个类,实现Servlet接口
    3. 实现接口中的抽象方法
    4. 配置Servlet
<servlet>
   <servlet-name>  demo1 </servlet>
   <servlet-class> cn.itcast.web.ServletDemon1 </servlet-calss>
<servlet/>
<servlet-mapping>
    <servlet-name>demo1</servlet-name>
    <url-pattern>/demo1</url-pattern>
<servlet-mapping>
<!-- 是将资源中的文件中的ServletDemon1映射为 资源名,
这样就可以直接路径访问-->

第二种方法:注解方法(必须是Servlet 3.0以上,和JDK 7以上)
在ServletDemon1 类上写上注解配置

@WebServlet("/demo1")
  • 执行原理:

    1. 当服务器接收客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet 的资源路径
    2. 查找Web.xml 文件,是否有对应的 url-partern 标签的内容
    3. 如果有,则找到对应的Servlet -class 全类名
    4. tomcat 会有字节码文件加载进内存,并且创建其对对象
    5. 调用方法
  • Servlet 的声明周期
    一、.被创建:执行init 方法,只执行一次
    去项目》web INF 》web.xml 文件中Servlet 这个标签下配置

  • Servlet 默认情况下,第一次访问时,Servlet被创建

  • 可执行Servlet 的创建创建时机

  • 第一次访问的时候创建:load-on-startup 的值为负值

  • 在服务器启动的时候创建值为0或正值

  • Servlet 创建对象只有一个的,当多个用户访问时,可能存在多线程安全问题,所以尽量将东西放在局部中

二、提供服务:执行service 方法,可执行多次
三、被销毁:执行destroy方法,只执行一次
1.服务器正常关系才会执行

Servlet 的体系结构

1.新类继承GenericServlet 就不用复写除了service 外的其他方法;GennericServlet 方法对 Servlet接口的其他方法默认空实现;
2.service 方法:
(1)判断方式:String mothond = req.gotMothod();

3.HttpServlet 的基本结构,也是继承了Servlet 接口,同样具有简化复写能力,同时对获取数据功能进行了封装,对http协议的一种封装,简化操作;

String mothod = req.gotMothod();
if("GET".equals(mothod))
{//用get 方法获取数据
}
else if("POST.equal(mothod)")
{//用post 方法获取数据
}
doGet();
doPost();
等http协议的七种状态

Servlet相关配置

1.url-partterns()参数是个数组,所以可以使用注解配置,实现一个类多个映射 :@webServlet({"/d4","/demo4",""/hehe})

@webServlet({"/d4","/demo4","/hehe"})

2.路径定义规则:(1)/xxx (2)/xxx/xxx (3)/* (通配型,等级最低);

HTTP

  • 概念:超文本传输协议,即C/S数据传输格式;
  • 特点:
    (1)基于TCP/IP的高级协议(TCP三次握手,安全);
    (2)默认端口号:80;
    (3)基于请求/响应模型即一次请求一次响;
    (4)无状态,每次请求请求相互独立,不能交互数据
  • 历史版本:
    (1)1.0 版本:连接多次建立与断开;
    (2)1.1 版本:复用连接,采取等待方法;

请求消息格式:

(1)请求行
请求方法 请求url 请求协议/版本
GET /login.html HTTP/1.1
请求方式:
GET 的参数放在url后面;url 长度是有限制的;不太安全
POST放在请求体中;url长度是没有限制的;相对安全

(2)请求头
Host:主机名
User-Agent:浏览器告诉服务器,使用的浏览的版本信息(可以在服务器端获取该头信息,解决服务器的兼容性问题)
Accept:告诉服务器本浏览器能解析什么形式信息;
Referer:告诉服务器,当前请求从哪里来;(防盗链,统计工作)
Connection:显示连接状态

(3)请求空行: 用于分隔作用
(4)请求体(正文) GET没有,POST有:放参数

request对象继承体系结构

ServletRequest ---- 接口
| 继承
HttpServletRequest ---- 接口
| 实现
org.apache.catalina.connerctor.RequestFacade 类(tomcat)

RequestFacade 是tomcat 自己写好的类,该类实现了HttpServletRequest接口,所以当传送数据过来的时候,tomcat自动创建对象。

消息处理过程

用户通过浏览器访问服务器(会传送请求消息)

  1. tomcat服务器会根据请求url中的资源路径,创建对应的ServletDemo1的对象。
  2. tomcat服务器,会创建request和response对象,request对象中封装请求消息数据,这两个对象时service方法中的两个参数对象;
  3. tomccat将requset 和 response两个对象传递给service方法,并且调用service方法。
  4. 程序员,可以调用request对象回去请求消息数据,通过request对象回去请求消息数据,通过response对象设置响应消息数据
  5. 服务器在给浏览器作出响应之前会从response对象中拿程序员设置的响应消息数据。
    服务器对浏览器做出响应

响应消息格式

参数对象可以通过调用下面的方法获取信息

  • request 请求消息数据格式:

GET/day14/demo1?name=zhangsan HTTP/1.1
(1)获取请求行数据:GET

 String getMethod()

(2)获取虚拟目录:/day14

 String getContextPath()

(3)获取Servlet路径:/demo1

String getServletPath()

(4)获取get方式请求参数:name=zhangsan

String getQueryString()

(5)获取请求URI:/day14/demo1

String getRequestURI();      /day14/dmo1
StringBuffer getRequestURL();  :http://localhost/day14/dmo1

(6)获取协议及版本:HTTP/1.1

String getProtocol();

(7)获取客户机的IP地址

String getRemoteAddr()

- 获取请求头:user-agent
String getHeader(String name)

public class RequestDemo3 extands HttpServlet{
protected void doPost(){}
protected void doGet(HttpServletRequest request)
{String agent =request.getHeader("Chrome")}
}

String getHeader(" referer") 也可以获得Referer信息
Enumberation getHeaderNames():获取所有的请求头名称

  • 获取请求体数据:
    1.请求体只有POST请求方式,才有请求体,在请求体中封装了POST请求
    2.步骤:(1)获取流对象:字节流与字符流
    Bufferedreader getReader():获取字符输入溜流,只能操作字符数据;
    ServletInputStream getInputStream();获取字节输入流,可以操作所有类型
    (获取对象中的数据)
public class RequestDemo3 extands HttpServlet{
protected void doPost(HttpServletRequest request){
BufferedReader br =  request.getReader();
String line=null;
while(line=br.readLine()!=null)
{System.out.println(line);}
}
protected void doGet()
{}
}

  • 其他功能:GET和POST都能用
    (1)获取请求参数通用方式:
1.String getParameter(String name);
根据参数名称获取参数值 比如参数输入为username 则返回值为zhangsan
2.String[] getParameterValues(String name):
根据参数名称获取参数的数组,即一键多值
3.Enumeration<String> getParameterNames():
获取所有请求参数的名称
4.Map<String,String[]> getParameterMap():
获取所有的键值对

  • 解决中文乱码问题:
    1.在tomcat8 以上版本解决了 GET请求方式的中文乱码问题,
    POST会乱码:可以在在请求参数前设置request 的编码:request.setCharacterEncoding(“utf-8”)
public class RequestDemo3 extands HttpServlet{
request.setCharacterEncoding("utf-8");
protected void doPost(){}
protected void doGet(HttpServletRequest request)
{String agent =request.getHeader("谷歌")}
}

(2)请求转发:一种在服务器内部的资源跳转方式,一次请求访问多次资源的方式。
步骤:
1.通过request对象获取请求转发器对象:

 RequestDispatcher getRequestDispatcher(String path)

2.使用RequestDispatcher 对象调用下面方法来进行转发:

 forward(ServletRequest request,ServlerResponse response)

特点:
1.浏览器地址栏路径没有发生变化
2.只能转发当前服务器内部资源
3.转发是一次请求
(3)共享数据
域对象:一个有作用范围的对象,可以再范围内共享数据
request:他的域就是一次请求,一般用于请求转发的多个资源中共享数据
方法:
1.存储数据 :存储完的数据可以共享,比如我们登录的用户信息,在成功登入后,新页面是有保留你的用户信息的。

void setAttribute(String name,object obj)

2.通过键获取值

object getAttitude(String name)

3.通过键移除键值对

void removeAttribute(String name)

(4)获取ServletContext
RequestDemo4

@webservlet("/demo4")
public class RequestDemo4 extands HttpServlet{

protected void doPost(){}
protected void doGet(HttpServletRequest request)
{System.out.println("demo444被访问了");
request.setAttribute("name","zhangsan");//设置共享数据
RequestDispatcher getRequestDispatcher("/demo5").forward(ServletRequest request,ServlerResponse response)
}
}

RequestDemo5

@webservlet("/demo5")
public class RequestDemo4 extands HttpServlet{

protected void doPost(){}
protected void doGet(HttpServletRequest request)
{System.out.println("demo555被访问了");
object n=request.getAttitude("name");
System.out.println(n);
}
}

Response

响应消息

  • 响应行:http协议,版本信息,状态码
    1.格式:HTTP/1.1 200 ok
    2.设置状态码:setStatus(int sc)服务器告诉客户端浏览器本次请求和响应的状态
    (1)1xx;服务器接收客户端消息,还没接收完成,等一段时间后,发生这类状态码,告诉服务器还有没有传送完成
    (2)2xx;代表传送完成
    (3)3xx;302重定向,304缓存
    (4)4xx;代表客户端错误404 ;405请求方式没有对应的doxxx方法
    (5)5xx;代表服务器错误,服务器内部异常
  • 响应头
    常见的响应头:
    1.Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
    2.Content-diposition:服务器告诉客户端以什么格式打开响应体数据:in-line 默认值,指当前页面打开,;attachment,filename=xxx:以附件形式打开响应体,如文件下载
setHeader(String name,String value)
  • 响应体:真实的传输数据
    服务器输出数据到浏览器
    使用步骤:
    1.获取输出流:
    字符输出流:PrintWriter getWriter()
    字节输出流:ServletOutputSream getOutputStream()
    字符串对象.getBytes()转化为字节流
    2.使用输出流,将数据输出到客户浏览器
@WebsServlet("resposeDemo4")
public class ResponseDemo4 extends HttpServlet{
protected void doPost(HttpServletRequest request,HttpServletResponse response)
可以在获取流对象的时候设置编码格式
response.setCharacterEncoding("utf-8");
也可以让服务器告诉浏览器,建议用什么编码
response.setHeader("content-type","text/html;charset=utf-8");
也可以简单的形式设置编码
respose.setContentType("text/html;charset=utf-8");
获取字符输出流:调用方法获取流对象赋值给对象pw
PrintWriter pw = response.getWriter();
输出数据
pw.write("hello java");
}

3.验证码

@webservlet("/checkcode")
public class Checkcode extands HttpServlet{

protected void doPost(){}
protected void doGet(HttpServletRequest request,HttpServletResponse response)
{
int width=100;
int height=50;
//1.创建一对象,在内存中图片(验证码图片对象)
BufferedImage image= new BuffereImage(width,height,BuffereImage.TYPE_INF_RGB);


//2.美化图片
//2.1填充背景颜色
Graphics  g=imgae.getGraphics();//画笔对象
g.setColot(Color.PINK);//设置图片颜色
g.fillRect(0,0,width,height);//填充空间


//2.2画边框
g.setColor(Color.BLUE);
g.drawRect(0,0,width-1,height-1);
//2.3写字
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
//生成随机角标
Random ran = new Random();
int index = ran.nextInt(str.length()); 
//获取字符
char ch=str.charAt(index);//随机字符
for(i=0;i<4;i++)
g.drawString(ch++,width/5*i,height/2);


//2.4画干扰线
g.setColor(Color.GREEN);
//随机生成坐标点
for(int i = 0;i<10;i++){
int x1 = ran.nextInt(width);
int x2 = ran.nextInt(width);
int y1 = ran.nextInt(height);
int y2 = ran.nextInt(height);
g.drawLine(x1,y1,x2,y2);
}
//将验证码放入HttpSession中,也就是request中
request.getSession().setAttribute("CHECKCODE_SERVER",checkCode)

//3.将图片输出到页面展示
ImageIO.write(image,"jpg",response.getOutputStream());
}
}
  • 重定向:
    A告诉用户浏览器 B有需要的资源;
    1.告诉浏览器重定向:状态码302
response.setStatue(302)

2.告诉浏览器B资源路径

response.setHeader("虚拟路径","资源路径")

3.简单的重定向方法

response.sendRediret("/day15/resposeDemo2");

转发:forward
重定向:redirect

  • 重定向的特点
    1.地址栏发生变化
    2.重定向可以访问其他站点(服务器)的资源
    3.重定向是两次请求,所以不能再request中共享数据了
  • 路径写法
    1.绝对路径:/ 开头
    给客户端用:需要加虚拟路径(项目的访问路径)
    给服务器用:(转发)
    采用动态虚拟目录:
String contextPath=request.getContextPath();
response.sendRedirect("contextPath/responseDemo2");

2.相对路径:以 . 开头, 找到当前路径和目标资源之间相对位置关系,同个父目录下
当前: http://location/day15/htmls/location2.html
目标: http://location/day15/hemls/responseDemo2
那么要将第二个网址在第一个网址中使用,可以写成相对路径: . ./responseDemo2

  • ServletContext对象
    概念:代表整个web应用,可以和程序的容器(服务器)来通信
    获取:request.getServletContext();或HttpServlet获取:this.getHttpServletContext()
    功能:
    1.获取MIME类型:在互联网通信过程中定义的一种文件数据类型,是标准
    格式:大类型/小类型 如:text/html 或 image/jpeg
    获取:
    String getMimeType(String file)
    2.域对象:共享数据,范围是大的,共享所有用户的数据

3.获取文件的真实路径(服务器路径)
String getRealPath(String Path)

ServletContext context=this.getServletContext();
String c=context.getRealPath("/b.txt");//获取资源的真实路径
System.out.println(c);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值