知识点: request对象:
分析: eg: http://localhost/day101/row?username=xiaoming&password=123&hobby=smoking&hobby=drink
1.请求行:
格式:
请求方式 资源路径?参数名=参数值&参数名=参数值(get请求) 协议/版本
例子:
GET /test?username=xiaoming&password=123&hobby=smoking&hobby=drink HTTP/1.1
1)获取资源路径 (有用)
request.getRequestURI();
2)获取get请求的请求参数 并且字符串返回(无用)
request.getQueryString();//例子 返回username=xiaoming&password=123&hobby=smoking&hobby=drink
3)获取协议/版本 (基本无用)
request.getProtcol()//返回 HTTP/1.1
4)获取请求类型
request.getMethod();//
5)获取项目路径
request.getContextPath()//一级重要
只要是在代码中用到了项目地址 一定要使用该方法动态获取 不要自定义
6)获取远程请求ip地址
request.getRemoteAddr()//
2.请求头:
key/value的形式
String 请求头值=getHeader("请求的名字");//获取请求头-->重要
了解:
int getIntHeader("请求的名字");//int值
long getDateHeader("请求的名字");//日期类型值
Enumeration(集合) request.getHeaders();//获取多值的
Enumeration(集合) request.getHeaderNames();//获取所有请求头的名字
User-Agent:告知服务器 来访问的客户端是哪个牌子的浏览器
referer:请求来源
3.请求体(post):请求头结束后隔一行就是请求体
post请求体 放置请求参数
http://localhost/day101/param?username=xiaoming&password=123&hobby=smoking&hobby=drink
String 参数值 = getParameter("参数名")//返回请求参数值 返回单值参数
String[] 多值参数 = getParameterValues("参数名")//返回请求参数值 返回多值参数
Map<string,string[]> 所有参数=getParameterMap();
4.请求参数乱码问题:
post请求参数乱码
因为浏览器在发送数据的时候,它会将中文进行utf-8编码
但是服务器
请求行资源路径(也就是get请求) 解码采用utf-8编码
请求体中(post请求)采用iso-8859-1解码的
解决方案:告知服务器对post请求体中的数据用utf-8解码
request.setCharacterEncoding("utf-8")//告知服务器对post请求体中数据采用utf-8 解码
5.请求转发技术:
dispatcher对象=request.getRequestDispatcher("/要找的servlet资源");
dispatcher对象方法:
forward(request,response);
//request的属性操作
getAttribute()
setAttribute()
removeAttribute()
注意事项:
有关属性的操作不可用在重定向中
原因: request生命周期:
1.每当请求 来的时候创建的
2.请求结束 响应内容完了也就结束
6.jsp技术:
java server pages 服务器页面
特点:
允许开发人员在jsp页面上 既可以写html代码 也可以写java代码
怎么创建jsp:使用idea新建一个JSP
发生了什么事:
当访问一个jsp文件时候,服务器交给了jspservlet帮它处理,
它首先去项目中找对应jsp文件,执行翻译过程,拼接字符串-->拼成了一段java代码
执行编译 把java代码编译成class文件 调用它的方法 输出给浏览器内容
jsp本质就是一个servlet
7.请求转发和重定向的区别:
1)请求次数:
请求转发:1次
重定向:2次 一次手动 一次自动
2)地址栏问题:
请求转发:不会变
重定向:会变 变到最后一个位置
3)谁的方法:
请求转发:request.getrequestDispather("/").forward(request,response)
重定向:response.sendRedirect("路径")
4)路径:
请求转发:request.getrequestDispather("/内部路径").forward(request,response)
重定向:response.sendRedirect("路径") 可以走向任何地址
5)属性操作:
请求转发:可以使用
重定向:不要用
- 1.重定向的地址栏会发生变化,转发的地址栏不变.
- 2.重定向两次请求两次响应,转发一次请求一次响应.
- 3.重定向路径需要加工程名,转发的路径不需要加工程名.
- 4.重定向可以跳转到任意网站,转发只能在服务器内部进行转发.
案例一: 完成注册流程:
需求:
访问服务器 访问注册页面 注册表单 让用户可以输入用户信息
点击提交 把信息提交到服务器 将信息变成数据 插入至用户表
步骤分析:
1.数据库 创建表
2.创建工程
1)导入jar包 (一定要把jar包拷贝一份到新建的项目中)
2)配置文件 (要用到c3p0-config.xml 放到src下面)
3)工具类(DataSourceUtil 创建QueryRunner对象时用到 DataSourceUtil.getDataSource())
4)三层结构(web,service,dao 各司其职)
3.逻辑部分:
1)前端页面
2)后端部分:
设置请求和响应的字符编码:
request.setCharacterEncoding(“utf-8”);//只对post有效
response.setContentType(“text/html;charset=utf-8”);
获取请求数据:遍历得到key&values
注意:(封装对象)
参数数量大于四个 封装对象(beanUtils封装 反射原理)
重定向到登录页面:
request.getRequestDispatcher(“/login.htm”).forward(request,response);
4.工具介绍:
beanUtils 是apache提供的
beanUtils.populate(javaBean,map集合)
案例二 查询所有用户
需求:
访问某个servlet 查询数据库中所有用户
并且要求以table表格形式展示给用户
问题:
返回数据 如果是个页面 拼接字符串比较麻烦 使用jsp
实现分析:
1.servlet部分:
调用service类中的findAll方法 查询所有用户 返回的是一个list集合 存放的是users
List users = service.findAll();
拿到users就要给用户显示table表格,但是需要用字符串拼接,麻烦 (用到请求转发 jsp技术)
使用request对象设置Attribute属性 key/value的形式 以便于后面获取时使用 getAttribute(“user”)
request.setAttribute(“users”,users);
将拿到的数据转发给jsp(底层也是一个servlet),帮忙拼接
request.getRequestDispatcher(“/xxx.jsp”).forward(request,response);
2.service调用dao层的方法findAll(),dao层负责与数据库交互查询用户请求的数据
3.jsp页面可以写html和java代码
用html语言构建一张表格
用java代码填充表格:
循环遍历拿到集合中的数据获取每一个user的属性值填充至表格
编程思路:数据准备跟数据展示相分离
各司其职:
servlet只负责接受请求,调用service 完成数据准备工作
接下来servlet将请求转发给jsp,jsp负责展示数据
总结:
1.思维:
request是什么?
request是服务器创建的请求对象
request生命周期:
1)每当请求 来的时候创建的
2)请求结束 响应内容完了生命周期结束
请求转发技术是怎样和jsp结合的?
在servlet中绑定请求转发路径:
request.getRequestDispatcher("/xxx.jsp").forward(request,response);
2.代码:
案例敲一遍
重要:getContextPath()//动态获取项目路径
请求转发:
request.getrequestDispather("/").forward(request,response)
request提供了一组xxxAttribute()方法
//request的属性操作
getAttribute()
setAttribute()
removeAttribute()