标签:where jdbc工具类 取数 system java代码 调用 字符 rom cte
Request
一、HttpServletRequest
1、HttpServletRequest概述
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。
request对象是JSP中重要的对象,每个request对象封装着一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径。
2、Request的运行流程
同Response。
3、request获得请求内容
请求行
获得客户端的请求方式: String getMethod();
获得请求的资源: String getContextPath();---web应用的名称
String getRequestURI()
StringBuffer getRequestURL()
String getContextPath() ---web应用的名称
String getQueryString() ---- get提交url地址后的参数字符串
//1、获得请求方式
String method = request.getMethod();
System.out.println("method:"+method);
//2、获得请求的资源相关的内容
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println("uri:"+requestURI);
System.out.println("url:"+requestURL);
//获得web应用的名称
String contextPath = request.getContextPath();
System.out.println("web应用:"+contextPath);
//地址后的参数的字符串
String queryString = request.getQueryString();
System.out.println(queryString);
//3、获得客户机的信息---获得访问者IP地址
String remoteAddr = request.getRemoteAddr();
System.out.println("IP:"+remoteAddr);
注意:request获得客户机(客户端)的一些信息
request.getRemoteAddr() --- 获得访问的客户端IP地址
请求头
获得指定请求头: String getHeader(String name);
获取所有请求头的名称:java.util.Enumeration<String> getHeaderNames();
long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)
//1、获得指定的头
String header = request.getHeader("User-Agent");
System.out.println(header);
//2、获得所有的头的名称
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
System.out.println(headerName+":"+headerValue);
}
referer 头的作用:执行该此访问的来源做防盗链
请求体
请求体中的内容是通过post提交的请求参数,格式是:
username=zhangsan&password=123&hobby=football&hobby=basketball
key ---------------------- value
username [zhangsan]
password [123]
hobby [football,basketball]
获取paramName请求参数的值:
String getParameter(String paramName);
paramName请求参数的值,当该请求参数有多个值时,该方法将返回多个值所组成的数组:
String[] getParameterValues(String name);
获取所有请求参数名和参数值所组成的Map对象
Map<String,String[]> getParameterMap();
获取所有请求参数名所组成的Enumeration对象
Enumeration getParameterNames();
//1、获得单个表单值
String username = request.getParameter("username");
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);
//2、获得多个表单的值
String[] hobbys = request.getParameterValues("hobby");
for(String hobby:hobbys){
System.out.println(hobby);
}
//3、获得所有的请求参数的名称
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
System.out.println(parameterNames.nextElement());
}
System.out.println("------------------");
//4、获得所有的参数 参数封装到一个Map<String,String[]>
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("---------------------------");
}
注:Map复杂了一点,但是比较有用。
注意:不论是get请求方式还是post请求方式,上述的方法一样可以获得。
4、Request的其他功能
a、request是一个域对象
request对象也是一个存储数据的区域对象,所以也具有如下方法:
setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)
注意:request域的作用范围:一次请求中
在request中存储数据,然后通过请求转发能够获取到(重定向没有数据)。(a与b结合来看)
b、request完成请求转发
获得请求转发器----path是转发的地址
RequestDispatcher getRequestDispatcher(String path)
通过转发器对象转发
requestDispathcer.forward(ServletRequest request, ServletResponse response)
//servlet1将请求转发给servlet2
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");
dispatcher.forward(request, response);
注意:转发与重定向的区别?
1)重定向两次请求,转发一次请求
2)重定向地址栏的地址变化,转发地址不变
3)重新定向可以访问外部网站 转发只能访问内部资源
4)转发的性能要优于重定向
重定向是服务器外部行为,请求转发是服务器内部行为。
注意:ServletContext域与Request域的生命周期比较?
ServletContext:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个web应用
request:
创建:访问时创建request
销毁:响应结束request销毁
域的作用范围:一次请求中
注意:客户端地址与服务器端地址的写法?
客户端地址:是客户端去访问服务器的地址,服务器外部的地址。其特点:写上Web应用的名称。
客户端地址有:直接输入地址;重定向;
服务器端地址:服务器内部资源跳转的地址。其特点:不需要写Web应用的名称。
二、完成用户注册
1、获取表单的数据
2、将数据存储到数据库中
注意:中文乱码问题;BeanUtils:将Map中的数据映射到实体中(JavaBean),根据map的key与实体的属性进行对比。
注册的基本实现:
1、完成登录页面(html or jsp)
2、JDBC工具类实现
jar包:c3po.....dbutils.......mysql-connector....
c3p0-config.xml
DataSourceUtils.java
3、JavaBean实现User(实体数据封装到JavaBean中,数据工整,面向对象思想)
4、注册servlet实现
//1.获取数据
//String username = request.getParameter("username");
//String password = request.getParameter("password");
//2.将散装的数据封装到JavaBean中
//User user = new User();
//user.setName(username);
//user.setPassword(password);
//1.2使用BeanUtils进行自动映射封装
//BeanUtils工作原理:将map中的数据,根据key与实体的属性的对象关系封装
//只要key的名字与实体的属性的名字一样,就自动封装到实体中
Map<String, String[]> properties = request.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user, properties);
} catch (IllegalAccessException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//现在这个位置user对象已经封装好了
//手动封装uid----uuid----随机的不重复的字符串32位
//java代码生成后是36位
user.setUid(UUID.randomUUID().toString());
response.getWriter().write(user.toString());
//3.将参赛传递给一个业务操作方法
try {
regist(user);
response.getWriter().write("regist success");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
注:红色部分需要添加jar包:beanutils 及 loggingjar包
解决获取数据的中文乱码问题?
//设置request的编码-----只适合post方式
request.setCharacterEncoding("UTF-8");
乱码过程:王五----使用UTF-8编码------使用iso8859-1解码------乱码xxx,
实现乱码的解决:xxx------使用iso8859-1编码------使用utf-8解码----王五
编码:str.getByte("iso8859-1");
new String(string,"utf-8");
//get方式乱码解决
String username = request.getParameter("username");//乱码
//先用iso8859-1编码,再使用utf-8解码
username = new String(username.getBytes("iso8859-1"),"UTF-8");
适用于get post
get不适用于表单提交。
用户登录失败的信息回显
//4.认为注册成功跳转到登录页面
//使用重定向,而非转发(地址变化)
response.sendRedirect(request.getContextPath()+"/login.jsp");
为什么使用request.getContextPath();
三、用户登录失败的信息回显
步骤:
1、用户登录
2、输入用户名密码
3、用户名及密码正确,跳转到首页(重定向)
4、用户名或密码不正确
5、转向登录页面,提示用户名或者密码错误
技术点:
1、登录页面设计(html or jsp)
表单form的action跳转到对应的servelt进行处理。
<form class="form-horizontal" action="/WEB15_Request/login" method="post">
2、LoginServlet.java (登录处理页面)
//0、设置Request编码
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//3.通过user是否为null判断用户名和密码是否正确
if(login!=null) {
//用户名和密码正确
//登录成功跳转到网站的首页(重定义)
response.sendRedirect(request.getContextPath());
}else {
//用户名或密码错误
//跳回当前页面login.jsp
//使用转发到login.jsp向
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;
}
3、登录页面错误回显代码 jsp
<div> <%=request.getAttribute("loginInfo")==null?"":request.getAttribute("loginInfo")%></div>
使用三目运算符,如果直接request话,会显示null在登录页面上面。
4、其他,暂无。
四、总结
1、request获得行的内容(请求参数)
request.getMethod();
request.getRequestURI();
request.getRequestURL();
request.getContextPath();
request.getRemoteAddr();
2、request获得头的内容
request.getHeader(name);
3、request获得体(请求参数)
String request.getParameter(name);
Map<String, String[]> request.getParameterMap();
String[] request.getParametherValues(name);
注意:客户端发送的参数到服务器端获得的值都是字符串。
中文乱码问题:
post:
request.setCharacterEncoding("UTF-8");
get(原始方法):
username = new String(username.getBytes("iso8859-1"),"UTF-8");
4、request其他内容 (转发和域)
在域存储数据:
request.setAttribute(name,value);
request.getAtteribute(name);
转发:
request.getRequestDispatcher(转发的地址(服务器内部地址)).forward(request,response);
Request
标签:where jdbc工具类 取数 system java代码 调用 字符 rom cte
原文地址:http://www.cnblogs.com/scalpel-ct/p/7502986.html