HttpServletRequest请求
【1】request获取请求行信息
(1)获取请求方式
String method = request.getMethod();//打印post/get
(2)获取请求资源相关的内容
String requestURI = request.getrequestURI();///Demo/demo
String requestURL = request.getrequestURL();//http://loaclhost:/Demo/demo
(3)获取web应用名称
String contextPath = request.getContextPath();//web:Demo
(4)获取地址后的参数字符串
String queryString = request.getQueryString();//post为空,get显示内容
(5)获取用户访问的客户端IP地址
request.getRomoteAddr();//192.1.1.1
【2】获取请求头
(1)获取指定头
request.getHeader(String name);
(2)获取所有头的信息
Enumertion<String> headerNames = request.getHeaderNames();
while(headerNames .hasMoreElements()){//判断有没有
String headerName = headeNames.nextElement();//获取一个请求头
String headerValue = request.getHeader(headerName);//调用方法获取头内容
//打印:如:User-Agent:xxx;
}
request头的作用:执行该次访问的来源,做防盗链,防止被人盗数据
如:
String header = request.getHeader("referer"); if(header != null && header.startsWith("http://hoaclhost")){ respose.setContentType("text/html;charset=UTF-8"); respose.getWriter.writer("可显示的内容"); }else{ respose.getWriter.writer("盗链者");//也可以用重定向跳转到你先要跳转的网址 }
【3】request请求体
(1)获取单个表单的值(常用)
String name = request.getParameter(String ame);
(2)获取表单多个值(不常用)
String[] name = request.getParameterValues(String name); for(String str : name){ System.out.println(name); }
(3)获取所有请求参数名称(几乎不用)
Enumeration<String> parameterNames = request.getParameterNames(); while(parameterNames.hasMoreElements()){ System.out.println(parameterNames.nextElement()); }
(4)获取所有的参数封装到一个Map集合里
Map<String, String[]> parameterMap = request.getParameterMap(); for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) { System.out.println(entry.getKey()); for(String str : entry.getValue()){ System.out.println(str); } System.out.println("---"); }
【4】request的其他功能--转发和域
(1)request是一个域对象
Servlet1
/向request域中存储数据 request.setAttribute("name", "tom"); //servlet1 将请求转发给servlet2 RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2"); //执行转发的方法 dispatcher.forward(request, response);
Servlet2
注意:request域的作用范围,一次请求中能获取值//从request域中取出数据 Object attribute = request.getAttribute("name"); response.getWriter().write("hello haohao..."+attribute);
【5】注册,登录案列
(1)注册
HTML代码
<form class="form-horizontal" style="margin-top: 5px;" action="/WEB15/register" method="post"> <div class="form-group"> <label for="username" class="col-sm-2 control-label">用户名</label> <div class="col-sm-6"> <input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名"> </div> </div> <div class="form-group"> <label for="inputPassword3" class="col-sm-2 control-label">密码</label> <div class="col-sm-6"> <input type="password" class="form-control" id="inputPassword3" name="password" placeholder="请输入密码"> </div> </div> <div class="form-group"> <label for="confirmpwd" class="col-sm-2 control-label">确认密码</label> <div class="col-sm-6"> <input type="password" class="form-control" id="confirmpwd" placeholder="请输入确认密码"> </div> </div> <div class="form-group"> <label for="inputEmail3" class="col-sm-2 control-label">Email</label> <div class="col-sm-6"> <input type="email" class="form-control" id="inputEmail3" name="email" placeholder="Email"> </div> </div> <div class="form-group"> <label for="usercaption" class="col-sm-2 control-label">姓名</label> <div class="col-sm-6"> <input type="text" class="form-control" id="usercaption" name="name" placeholder="请输入姓名"> </div> </div> <div class="form-group opt"> <label for="inlineRadio1" class="col-sm-2 control-label">性别</label> <div class="col-sm-6"> <label class="radio-inline"> <input type="radio" name="sex" id="inlineRadio1" value=male>男 </label> <label class="radio-inline"> <input type="radio" name="sex" id="inlineRadio2" value="female">女 </label> </div> </div> <div class="form-group"> <label for="date" class="col-sm-2 control-label">出生日期</label> <div class="col-sm-6"> <input type="date" class="form-control" name="brithday"> </div> </div> <div class="form-group"> <label for="date" class="col-sm-2 control-label">验证码</label> <div class="col-sm-3"> <input type="text" class="form-control" name="yzm"> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <input type="submit" width="100" value="注册" name="submit"> </div> </div> </form>
RegisterServlet类
//设置request的编码---只适合post方式 request.setCharacterEncoding("UTF-8"); //get方式乱码解决 //String username = request.getParameter("username");//乱码 //先用iso8859-1编码 在使用utf-8解码 //username = new String(username.getBytes("iso8859-1"),"UTF-8"); //使用BeanUtils进行自动映射封装 //BeanUtils工作原理:将map中的数据 根据key与实体的属性的对应关系封装 //只要key的名字与实体的属性 的名字一样 就自动封装到实体中 Map<String, String[]> properties = request.getParameterMap(); User user = new User(); try { BeanUtils.populate(user, properties); } catch (IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } //现在这个位置 user对象已经封装好了 //手动封装uid----uuid---随机不重复的字符串32位--java代码生成后是36位 user.setUid(UUID.randomUUID().toString()); //3、将参数传递给一个业务操作方法 try { regist(user); } catch (SQLException e) { e.printStackTrace(); } //4、认为注册成功跳转到登录页面 response.sendRedirect(request.getContextPath()+"/login.jsp"); } //注册的方法 public void regist(User user) throws SQLException{ //操作数据库 QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource()); String sql = "insert into user values(?,?,?,?,?,?,?,?,?,?)"; runner.update(sql,user.getUid(),user.getUsername(),user.getPassword(),user.getName(), user.getEmail(),null,user.getBirthday(),user.getSex(),null,null); }
用户类:User//要实现get和set
private String uid; private String username; private String password; private String name; private String email; private String sex; private String birthday;
(2)登录
login.jsp代码
LoginServlet代码<div><%=request.getAttribute("LoginInfo")==null?"": request.getAttribute("LoginInfo")%></div> <form class="form-horizontal" action="/WEB15/login" method="post"> <div class="form-group"> <label for="username" class="col-sm-2 control-label">用户名</label> <div class="col-sm-6"> <input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名"> </div> </div> <div class="form-group"> <label for="inputPassword3" class="col-sm-2 control-label">密码</label> <div class="col-sm-6"> <input type="password" class="form-control" id="inputPassword3" name="password" placeholder="请输入密码"> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <input type="submit" width="100" value="登录" name="submit"> </div> </div> </form>
request.setCharacterEncoding("UTF-8");
//1、获得用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//2、调用一个业务方法进行该用户查询
User login = null;
try {
login = login(username,password);
} catch (SQLException e) {
e.printStackTrace();
}
//3、通过user是否为null判断用户名和密码是否正确
if(login!=null){
//用户名和密码正确
//登录成功 跳转到网站的首页
response.sendRedirect(request.getContextPath());
}else{
//用户名或密码错误
//跳回当前login.jsp
//使用转发 转发到login.jsp 向request域中存储错误信息
request.setAttribute("loginInfo", "用户名或密码错误");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
public User login(String username,String password) throws SQLException{
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from user where username=? and password=?";
User user = runner.query(sql, new BeanHandler<User>(User.class), username,password);
return user;
}
【6】总结
1,request获取行的内容
request.getMethod();//post,get
request.getRequestURI();///Demo/demo
request.getRequestURL();//http://loaclhost:8080/Demo/demo
request.getContentPath();//web名称
request.getRemoteAddr();//客户端IP
2,request获取头内容
request.getHeader();
3,request获得体(请求参数)
String request.getParameter(name)
Map<String,String[]> request.getParameterMap();
String[] request.getParameterValues(name);
注意:客户端发送的参数 到服务器端都是字符串
获得中文乱码的解决:
post:request.setCharacterEncoding(“UTF-8”);
get:parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”);
4,request转发和域
request.getRequestDispatcher(转发的地址).forward(req,resp);
request.setAttribute(name,value)
request.getAttribute(name)