request请求
第1章request对象介绍(方向:浏览器——> 服务器)
通过前面的servlet学习,我们了解的使用java servlet小程序处理请求和响应的过程中有request对象和response对象帮助我们处理请求响应
那么今天,我们先从请求request对象入手,开始学习:
Request对象学习的思路:
1 如果获取请求 行 头 体
2 请求中文处理
3 请求对象的其他常用方法
1.1request获得请求行信息和ip地址
请求行格式:
POST/day10/request1 HTTP/1.1
获得请求方法的类型: 如get 或 post
演示代码:
System.out.println(request.getMethod());
效果:
GET
请求的路径:
代码演示:
System.out.println(request.getRequestURI());
System.out.println(request.getRequestURL());
效果:
uri: 统一资源标识符,用来标识一个资源,资源路径。(相当于身份证
)
url: 统一资源定位符,是一种具体的URI,可以用来标识一个资源.并且指明了如何定位一个资源.(相当于身份证中的地址
)
获取请求的协议类型: 如 http/1.1
System.out.println(request.getProtocol());
效果:
HTTP/1.1
其他细节:
获取IP地址
访问地址:http://localhost:9090/aa/DemoServlet
访问地址:http://127.0.0.1:9090/aa/DemoServlet
127.0.0.1
注意,正在服务器解析的时候,效果虽然一致,但是,底层具体内容不一样
获取服务器的端口号
效果:
9090
1.2request获取头信息
Accept: text/html, application/xhtml+xml, */*
Referer: http://localhost/day19/post.html
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; qdesk 2.4.1272.203; Windows NT 6.1; WOW64; Trident/6.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost
Content-Length: 30
DNT: 1
Connection: Keep-Alive
Cache-Control: no-cache
需求:获取所有的请求头信息
代码演示:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration names = request.getHeaderNames();
while(names.hasMoreElements()){
String string = names.nextElement();
System.out.println(string+":"+request.getHeader(string));
}
}
效果:
host:127.0.0.1:9090
connection:keep-alive
cache-control:max-age=0
user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
upgrade-insecure-requests:1
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding:gzip, deflate, br
accept-language:zh-CN,zh;q=0.8
1.3请求参数乱码处理(重点):
乱码产生的原因:
1.3.1Get 提交的中文乱码解决:
GET方式
1.1.1.1 第一种方案:修改tomcat默认的编码方式(不推荐)
默认情况下,tomcat使用的的编码方式:iso-8859-1
修改tomcat下的conf/server.xml文件
找到如下代码:
这段代码规定了Tomcat监听HTTP请求的端口号等信息。
可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。
修改完成后:
缺点:
方法不是很常用. 修改tomcat的servlet.xml
会很死板.
如果两个项目: 一个是UTF-8, 另一个是GBK
1.3.1.2第二种方案:先编码再解码(重点)
1.3.2POST提交的中文乱码解决:
POST方式
1.3.2.1第一种解决方案 先编码再解码(了解):
1.3.2.2第二种解决方案 设置请求编码(重点):
这种方式只对 请求体 有效,算是post的偷懒方式,开发时最常用
1.4Request容器(存取删)(域对象)和请求转发(重点)
需求:
使用一个servlet专门处理获取请求参数,比对用户名和密码
,如果,成功(登陆成功),那么跳转下一个servlet,在下一个servlet响应页面结果!
请求转发:从一个servlet中启动另一个servlet。客户端浏览器地址栏不会变化,这个请求转发操作,全部在服务器内部执行。
代码演示:演示转发,重点——request.getRequestDispatcher("/my").forward(request, response);
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
if(name.equals("tom") && "111".equals(pwd)){
request.getRequestDispatcher("/my").forward(request, response);
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("login OK!!!!
");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
效果:
那么如果需要显示当前用户用户名,怎么办?
使用请求对象将获取到的请求参数保存下来:
可以保存以外,还可以,获取和删除:
那么,我们可以修改成:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
if(name.equals("tom") && "111".equals(pwd)){
request.setAttribute("name", name);
request.getRequestDispatcher("/my").forward(request, response);
}
}
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = (String)request.getAttribute("name");
response.getWriter().write("login "+name+" OK!!!!
");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
效果:
总结:
当一个Web资源收到客户端的请求后,如果希望服务器通知另外一个资源处理.
可以通过 转发对象 RequestDispatcher 对象的forward(request,response)方法,将当前请求传递给其他的Web资源进行处理,这种方式称为请求转发。
在这些转发的过程中,所有的Servlet共享同一个请求对象。 在转发中,客户端是感觉不到服务器内部在跳转。而且客户端的浏览器的地址栏中是不会发生任何变化的。
因为在多个Servlet中可以进行转发,导致多个Servlet之间共享同一个request对象,于是在发出转发的Servlet中,可以把request对象当做一个容器,然后给其中保存数据,在其他的Servlet中可以取出前面的Servlet给request对象中保存的数据。
request对象如果当做容器的话,它只是在当前这次请求中有效。当请求响应结束了,这个容器就消失了。
总结:
1 使用request对象,可以获取请求行
2 使用request对象,可以获取请求头
3 使用request对象,可以处理中文乱码
4 使用request对象,调用下一个servlet(请求转发)
5 使用request对象,在一个请求转发过程中,让两个servlet共享数据。
第2章注册案例
2.1分析
2.2实现
2.2.1页面 入口
1)导入jar包
2)配置文件
3)准备工具类
4)准备封装数据的实体类(JavaBean 模型)
2.2.2web层
在web层,我们获取数据,要进行封装的时候,数据太多了,一次次调用set方法太过麻烦,在这里我们介绍一个技术,给我解决问题:
BeanUtils:
学习新技术的思路:
1 百度新技术 获取官网
2 下载资料(jar包 API文档)
3 创建工程,测试新技术,需要查找到官网的用户指南(user guide,quick start)
4 根据用户指南测试技术
5 笔记,后期,在使用这个技术的是,可以看自己的笔记,效率更高,面试的时候,可以将笔记,作为一个加分项。
2.3BeanUtils的使用总结
1、需要导入两个jar包
2、使用BeanUtils类里面的populate方法
第一参数:数据要封装到的对象(Person)
第二个参数:要被封装数据,这个数据存放在一个map集合中
最后就会把map中的数据,封装到bean对象中。
应用:
public class RegisterServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
Map map = request.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user, map);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(user);
String[] values = request.getParameterValues("hobby");
String hobby = "";
for (String string : values) {
hobby = hobby +","+string;
}
hobby = hobby.substring(1);
user.setHobby(hobby);
UserService service = new UserService();
boolean info = service.register(user);
if(info){
response.getWriter().write("register OK!!!");
}else{
response.getWriter().write("register error!!!");
}
}
2.3.1业务层
public class UserService {
private UserDao userdDao = new UserDao();
public boolean register(User user) {
User findByname = userdDao.findByName(user.getName());
if(findByname == null){
userdDao.register(user);
return true;
}else{
return false;
}
}
2.3.2数据层
public class UserDao {
private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
public User findByName(String name) {
String sql = "select * from user where name = ?";
try {
return qr.query(sql, new BeanHandler(User.class), name);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
public void register(User user) {
String sql = "insert into user values(null,?,?,?,?,?,?,?,?,?)";
List
注意:注册的时候必须使用日期格式—— yyyy-MM-dd(BeanUtils默认支持的日期转换格式)