笔记-JavaWeb学习之旅10
servlet
server applet运行在服务器端的小程序,servlet就是一个接口,定义了java类被浏览器访问到的规则(java类重写这个接口,就可以被浏览器(tomcat)识别)
servlet方法:
init方法:只执行一次,servlet在第一次被访问时或者在服务器启动时被创建,就会执行init方法,
service方法:可以执行多次,每一次访问服务器就执行一次
destroy方法:在服务器被关闭前,就执行一次
servletconfig getserletconfig方法:获取servletconfig对象
string getservletinfo:获取servlet的一些信息
注解配置
在servlet3.0之前需要这样web.xml来配置项目的路径
在servlet3.0之后可以通过注解配置来选择项目路径了
servlet的子类
servlet是一个接口,他有两个抽象子类genericservlet和httpservlet.
package com.data.httpservlet; import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import java.io.ioexception; //http一共有其中请求方式 //可以使用httpservlet的方法来判断请求方式 //继承httpservlet @webservlet("/demo1") public class httpservletdemo extends httpservlet{ //重写父类方法 public void doget(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception { //如果是get请求方式就执行此语句 system.out.println("doget.....");//浏览器直接访问服务器的地址使用的是get方式 } public void dopost(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception { //如果是post请求方式就执行此语句 system.out.println("dopost");//输出结果dopost } }
使用post方式访问服务器
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>title</title> </head> <body> <!--指定地址demo3--> <!--指定访问方式post--> <form action="/demo1" method="post"> <input name="username" placeholder="请输入用户名"> <input type="submit" value="登录"> </form> </body> </html>
http:
概念:hyper text transfer protocol 超文本传输协议,定义了客户端和服务器端通信时,发送数据的格式
请求消息数据格式
1.请求行 :
格式:请求方式(get) 请求url(/hello.html) 请求协议/版本(http1.1)
当请求协议为get时,请求的参数在请求行中,为post时,请求的参数在请求体
2.请求头:就是我浏览器告诉服务器我有哪些信息
字符串格式:请求头名称:请求头值
常见的请求头:
host: localhost:8080
user-agent: mozilla/5.0 (windows nt 10.0; win64; x64; rv:67.0) gecko/20100101 firefox/67.0
accept-language: zh-cn,zh;q=0.8,zh-tw;q=0.7,zh-hk;q=0.5,en-us;q=0.3,en;q=0.2
referer: http://localhost:8080/hello.html(我火狐浏览器不知道怎么会没有显示这个头.....),这个头可以告诉服务器我从哪里来
3.请求空行:就是一个空行,分隔请求头和请求体
请求体:封装post请求消息的请求体参数的,username: zhangsan
request原理:
1.request和response对象是由服务器创建的,
2.request对象是来获取请求消息,response对象是来设置响应消息
request对象继承体系结构:
servletrequest(父接口)-->httpservletrequest(子接口)--->requestfacade(实现类)
request的功能
获取请求行的数据
import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import java.io.ioexception; //演示request对象获取请求行数据 @webservlet( "/demo") public class servlet extends httpservlet { protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { } protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { //获取请求行的请求方式 //request对象有tomcat服务器创建 string method = request.getmethod(); system.out.println(method);//get //获取请求行的虚拟目录 string method1 = request.getcontextpath(); system.out.println(method1);// /day13 //获取请求行的uri string method2 = request.getrequesturi(); system.out.println(method2);// /day13/demo //获取客户机的ip地址 string method3 = request.getremoteaddr(); system.out.println(method3);// 0:0:0:0:0:0:0:1 //获取请求行的请求参数 string method4 = request.getquerystring(); system.out.println(method4);// name=zhangsan } }
获取请求头的数据
import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import java.io.ioexception; import java.util.enumeration; @webservlet("/rdemo1") public class ruquestdemo1 extends httpservlet { protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { } protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { //获取所有请求头的名称 enumeration<string> headernames = request.getheadernames(); //遍历,相当于迭代器 //有下一个元素就为真 while(headernames.hasmoreelements()){ //获取元素 string name = headernames.nextelement(); //通过key找到value string value = request.getheader(name); system.out.println(name+"------"+value); // 所有头,获取出来了 // host------localhost:8080 // connection------keep-alive // upgrade-insecure-requests------1 // user-agent------mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/74.0.3729.169 safari/537.36 // accept------text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 //accept-encoding------gzip, deflate, br //accept-language------zh-cn,zh-hk;q=0.9,zh;q=0.8,en;q=0.7 //cookie------jsessionid=0329f34a83457e749b1818afbe4c0a57; idea-a0bb733=23efa255-9ce7-42d9-8d0b-9853348226b8; jsessionid=8fe68a2847dc38b4290adbce1bfd164f } } }
获取请求体数据
请求体:只有在post请求方式,才有请求体,在请求体中封装了post请求的请求参数
首先创建一个html文件,
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>title</title> </head> <body> <!--绑定服务器的地址--> <form action="/day13/rdemo1" method="post"> <input type="text" name="username"><br> <input type="text" name="password"><br> <!--向服务器提交数据--> <input type="submit" value="注册"> </form> </body> </html>
import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import java.io.bufferedreader; import java.io.ioexception; @webservlet("/rdemo1") public class ruquestdemo1 extends httpservlet { protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { //获取请求体的请求参数 //获取字符流 bufferedreader reader = request.getreader(); string line=null; while((line=reader.readline())!=null){ //读取一行写一行 system.out.println(line);// username=zhangsan&password=123 } } protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { } }
其他功能:
获取请求参数通用方式,不论是get请求还是post请求都可以使用下列方法来获取参数值
1.string getparameter(string name):根据参数名称获取参数值
2.string[] getparametervalues(string name):根据参数名称获取参数值的数组
3.enumeration
getparameternames();获取所有请求的参数名称
4.map<string,string[]> getparametermap():获取所有参数的map集合(与3不同的地方是,3所获得的键值对,是一个键只获取一个值,4方法的话一个键可以对应对个值)
map方法的 演示
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>title</title> </head> <body> <!--绑定服务器的地址--> <!--//不论是post请求还是get请求都一样--> <form action="/day13/demo3" method="get"> <input type="text" name="username"><br> <input type="text" name="password"><br> <input type="checkbox" name="hobby" value="打游戏">打游戏 <input type="checkbox" name="hobby" value="看电影">看电影 <!--向服务器提交数据--> <input type="submit" value="注册"> </form> </body> </html>
import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import java.io.ioexception; import java.util.map; import java.util.set; @webservlet("/demo3") //不论是get请求还是post请求都可以使用下面的方法获取请求的参数 public class requestdemo3 extends httpservlet { protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { map<string,string[]> map = request.getparametermap(); //把所有的键存到一个集合中 set<string> strings = map.keyset(); for(string key : strings){ //获取出每一个键 system.out.println(key); //获取出值的集合 string[] values = map.get(key); //获取出每一个值 for(string key2 : values){ system.out.println(key2); } system.out.println("---------------"); } } protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { this.dopost(request,response); } }
上一篇: 二货夫妻的爆笑日常