1.今日内容
今天的这个内容稍微有点多,而且事情有点多,所以一下花了两天左右,大概就说一下本篇博客的内容:1.Servlet的体系结构,主要就是可以使用继承Servlet的实现类HttpServlet;2.Http的请求体格式;3.Request的相关知识,特别多。
2.具体内容
2.1Servlet的体系结构
由于每次如果实现Servlet接口的话,都需要重写5个方法,但是我主要只是关心service方法。因此很费事。因此产生了Servlet的实现类GenericServlet。在这个实现类的使用中,由于每次还都需要判断<form>里面的action是get还是post,也有点麻烦,因此我们现在使用的HttpServlet就出现了。我们只需要重写它里面的方法就好了。包括doGet和doPost。
在此处,补充一个关于配置注解WebServlet的方式,一共有三种方式:
[email protected]({"/demo1","/demo2"}),这种就是一个资源有很多路径访问;
[email protected](“/demo/demo1”),多层目录
[email protected](“*.do”):这种就是只要后缀名是.do就能访问到,但是一定不能加/;
2.2Http初步解析
http:hyper text transform protocol,中文名称是超文本传输协议。身为传输协议,他就是用来定义客户端请求数据的格式和服务器发送数据的格式。
特点:
1.默认端口号是80;
2.基于请求/响应模型:一次请求对应一次响应;
3.无状态的:多次请求的数据不能通信
版本信息:
1.0:每次请求都要申请链接然后释放连接,速度比较慢
1.1:每次传输在一定时间内是可以复用的;
组成部分:
1.请求行
GET /login.html HTTP/1.1
传输方式一共七种,主要就是使用POST和GET,再说一下POST和GET的区别:
1.POST:请求url是没有长度限制的;请求参数包含在请求体里;
2.GET:请求的url长度是有限制的;请求参数包含在请求行中;
2.请求头:里面包含客户端告诉服务器的信息;
请求头名称:请求值
User-Agent:告诉服务器我是什么浏览器
Referer:告诉服务器我从哪里来
3.请求空行:就是一行空行,主要用于分隔请求头域请求体
4.请求体
这个属于是POST的请求方式特有的东西,里面的东西就是POST的请求参数
2.3request相关内容
request是客户端向服务器请求数据。首先我们先来想一下request和response的原理。当我们在Web中部署一个项目,然后启动Tomcat后,Tomcat会通过反射机制创建一个Servlet对象,然后这个对象会创建一个request和response对象,将这两个参数传入doGet或者doPost中。request是负责获取请求消息的,response是负责将响应数据封装的。在本篇中,只看request对象。
request中包含几个作用:
1.获取请求参数: GET /day14/servlet?username=zhangsan HTTP/1.1
这里面我们只重点看获取部分消息。
获取/day14:String getContextPath()
获取URL与URI:
String getRequestURL():http://localhost/day14/servlet
String getRequestURI():/day14/servlet
2.获取其他信息
在这里面定义的方法是可以用于GET和POST的;
1.获取参数
1. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
3. Enumeration<String> getParameterNames():获取所有请求的参数名称
4. Map<String,String[]> getParameterMap():获取所有参数的map集合
在这里可能会出现中文乱码的问题,只需要加一句:req.setCharacterEncoding("utf-8");
2. 请求转发
1.获取跳转的对象,只能是服务器内的资源路径:RequestDispatcher getRequestDispatcher(String path)
2.调用.forward方法实现跳转:void forward(ServletRequest request, ServletResponse response)
特点:1.只有一次请求;2.只能跳转到服务器内的资源;3.url地址栏中显示的是第一个访问的路径。
一般请求转发都使用链式编程:req.getRequestDispatcher("转发资源路径").forward(req.resp);
3.共享数据
域对象:在一次请求的过程中,数据是可以共享的。由于上面的数据转发就是一次请求,那么就是主要用在数据转发过程中。
void setAttribute(String name, Object o):设置共享数据
Object getAttribute(String name) :获取共享数据
void removeAttribute(String name) :删除共享数据
4.获得ServletContext对象
getServletContext():获得ServletContext对象
2.4BeanUtils
这个东西的使用的作用是在Servlet中,将获取到的req的数据封装为JavaBean对象的,在这里,需要将获取到的数据存入Map集合。
Map<String, String[]> map = req.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
2.5登录案例回想
1.首先导入很多的资源,包括.html;.properties;和很多jar包;
2.在数据库中创建数据,注意需要和druid.properties中的数据库对应;
3.创建一个domain包,里面定义一个user类,包含表中的数据的JavaBean;
4.创建一个UserDao类,里面提供一个Login方法,在里面写sq语句·,完成JDBCTemplate的操作;
template.queryForObject(sql,new BeanF...<User>(User.class),login.getUsername,login.getPassword);
5.在Servlet中创建对象,获取从html得到的数据并且封装为对象,然后使用login方法检验。检验成功就是共享数据加转发,检测失败就直接转发就行了。
3.总结
有一个比较大的登陆案例没往上面粘贴,反正我又不会上传jar包。但是真是有点费工夫。至少通过今天的学习,他主要是在后期扮演者我在前端点击一个按钮或者啥的,能给我一个动态资源的。我需要回忆一下这个登陆案例。还有,我感觉要成。