标签:处理 密码 字符流 utf-8 方式 map 自己 版本 ora
两个对象 request 和 response 指的是实现了 ServletResponse接口的
HttpServletResponse
2.在response中 存在的方法 响应给客户端
a) 如果一个方法过时了 一般源码有提示信息
效果图 输入www.localhost:80/jw08resq&req/Bservlet 错误
傻瓜式重定向不用明白原理
使用response的一个方法
字节流乱码 utf-------gbk
IS5 9 编码集中不存在中文
字节流 发文本 字符流 发图片或者多媒体信息
8服务器错误
告诉浏览器 服务器输入的文件类型 text/html是关于字符内容类型
“imgae/jpeg” 告诉浏览器 服务器发送过去的是一个图片
告诉浏览器 你发送的字节流 0101 是什么格式的 浏览器去解析 这个文件的是什么类型 image/jpeg
服务器把文件发送个浏览器
//0 告诉浏览器是什么东西(不用手动去类型查文件对象那个是什么)
//getServletContext().getMimeType(".jar") Context对象根据 后缀名去
web.xml查找mime类型.
response.setContentType(getServletContext().getMimeType(".avi"));
//告诉浏览器推荐用户使用什么名称下载 一般选择英文类型
response.setHeader("Content-Disposition", "attachment;filename=java.avi");
//1 获得图片的输入流
InputStream in =
getServletContext().getResourceAsStream("/WEB-INF/03225.avi");
//2 通过response获得输出字节流
OutputStream out = response.getOutputStream();
//3 两个对接
byte[] buffer = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
out.flush();
}
in.close();
out.close();
1.request对象 封装了 浏览器发过来的信息
Request对象
请求首行 请求方式 请求路径 协议/版本号
request.getMethod(): GET
request.getRequestURI(): /Day08-request/AServlet
request.getServletPath(): /AServlet
request.getContextPath(): /Day08-request 获得应用路径 /jw08rr02
request.getScheme(): http
请求头
//--原始方式获得请求头 比较繁琐有key 得到value
String getHeader(String name)
long getDateHeader(String name)
int getIntHeader(String name)
Enumeration getHeaders(String name)
Enumeration getHeaderNames()
//---javaee封装好的方法.
request.getContentLength(): -1
request.getContentType(): null
request.getLocale(): zh_CN zh 中文
request.getQueryString(): name=tom&age=18
request.getRequestURL(): http://localhost:8080/Day08-request/AServlet 绝对路径 网络上的任何资源
request.getRequestURI(): /Day08-request/AServlet 相对路径
request.getRemoteAddr(): 0:0:0:0:0:0:0:1
request.getRemoteHost(): 0:0:0:0:0:0:0:1
request.getRemotePort(): 52074 获得远端 浏览器的
request.getServerName(): localhost
request.getServerPort(): 8080
请求空行
请求正文 表单传送过来的键值对
2.1乱码:只要确保编码和解码一致,就绝对没有问题.
1.浏览器负责编码.浏览器使用的码表就是表单所在页面的码表.
2.服务器负责解码.服务器默认使用ISO-8859-1解码. 但如果你的服务器使用的是utf-8就不用配置了 如下配 置的URIEncoding来决定
解码码表
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" /> 在tomcat servlet .xml 中
如上配置会影响整个服务器不推荐.
我们使用如下代码解决:
//获得参数
String name = request.getParameter("name");
//因为服务器使用了错误的码表,那么我们按照错误的码表原路返回
byte[] nameByte = name.getBytes("ISO-8859-1");
//用正确的码表重新解码
String newName = new String(nameByte,"UTF-8");
System.out.println("解决之后的:"+newName);
因为Post解码是在调用getParameter同时进行解码,那么解决乱码只需要在调用该方法之前设置服务器解码方式
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println(name);
涉及到获得表单参数的方法还有哪些呢?
String getParameter() 根据键获得值
Map getParameterMap() 获得服务器保存表单参数的容器
就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la
for(Entry<String, String[]> en : map.entrySet()){
String key = en.getKey();
String[] value = en.getValue();
System.out.println(key+"==>" +Arrays.toString(value));
}
Enumeration getParameterNames() 获得提交的所有键 列举
while(en.hasMoreElements()){
String key = en.nextElement();
System.out.println("提交上来的键==>"+key);
}
String[] getParameterValues(String name) 根据键获得值.
获得一键对应多 个值的情况的.
System.out.println(Arrays.toString(habits));
//---------------------------------------------------------------------------------------------------------------------
一个Servlet处理完毕交给下面的servlet(JSP)继续处理.
作用:
在现实开发中,没有servlet转发给servlet的情况.都是由servlet转发给JSP.
这样可以达到分工的作用:
servlet: 比较适合处理业务.
JSP: 比较适合显示功能
注意问题:
//servlet中不要做 输出正文的动作,没有结果的
//如果放到前面会出现乱码. 解决 response.serCharacterEncoding(“utf-8”);
字符串 通过 utf-8编码 变为 二进制字节 传输
网页 通过 utf-8编码集 把二进制字节解码
逻辑处理
//1 获得表单提交的用户名密码
String name = request.getParameter("name");
String password = request.getParameter("password");
//2 判断是否正确 tom 1234 才算成功
if(name!=null && name.trim().length()>0 && name.equals("tom")&&
password!=null && password.trim().length()>0 &&
password.equals("1234")){
//成功 ==> 转发到成功页面
request.getRequestDispatcher("/login/success.jsp").forward(request,
response);
//自己来做,很多弊端,不要这样
/* AServlet a = new AServlet();
a.service(request, response);*/
}else{
//失败 ==> 转发到失败页面
request.getRequestDispatcher("/login/error.jsp").forward(request, response);
}
//但是响应头是可以设置的.
两个servlet(jsp)共同向浏览器输出内容.
作用:
在现实开发中,多个页面含有相同的内容,我们把相同的内容抽取到一个jsp中,在需要显示这个段内容的jsp中,包含抽取的jsp.可以达到
统一管理相同的内容.
有不严谨的地方 使用jsp标签来实现
原理:
在request对象中含有一个map.这个map就是request域.
作用:
在将来开发中. 使用请求转发时,servlet处理完数据, 处理结果要交给jsp显示. 可以使用request域将处理结果有servlet带给jsp显示. 共享数据
操作:
1.setAttribute(key,value) 存入一个键值对
2.getAttribute(key) 通过键取出值
3.getAttributeNames() 获得域中所有键
4.removeAttribute(key) 跟据键移除一个键值对
request的范围:
一个request对象对应一个request域(map).
系统当前有多少个request就有多少request域.
//1 获得表单提交的用户名密码
String name = request.getParameter("name");
String password = request.getParameter("password");
//
Map<String,String> error = new HashMap<String, String>();
//2 验证
if(!(name!=null && name.trim().length()>0 && name.equals("tom"))){
error.put("name", "用户名有误!");
}
if(!(password!=null && password.trim().length()>0 && password.equals("1234"))){
error.put("password", "密码错误!");
}
//将错误信息通过request域带到错误页面
request.setAttribute("error",error );
if(error.size() > 0){
//失败==> 回到登录页面,并显示错误信息
request.getRequestDispatcher("/login2/login.jsp").forward(request, response);
}else{
//成功==> 成功页面
request.getRequestDispatcher("/login2/success.jsp").forward(request, response);
}
<body>
<h1>用户登录</h1>
<form action="/Day08-request/HServlet" method="POST">
用户名:<input type="text" name="name" /> <br>
密码:<input type="password" name="password" /><br>
<input type="submit" >
</form>
<%
Map<String,String> error = (Map<String,String>)request.getAttribute("error");
if(error!=null && error.size()>0){
for(Entry<String,String> en : error.entrySet()){
out.print("<font color=‘red‘>");
out.print(en.getValue()+"<br>");
out.print("</font>");
}
}
%>
</body>
//=================================================================================================================
路径分为两种情况:
<form action="/Day08-request/AServlet" >
<a href="/Day08-request/AServlet" >
<img src="/Day08-request/AServlet" >
response.sendRedirect("/Day08-request/AServlet")
Refresh:3;url=/Day08-request/AServlet
路径写法:
带"/" : "/" ==> 相对于 主机.
例如: 表单所在页面路径为==>
http://localhost:8080/Day08-request/login.jsp ==> "/" 代表http://localhost:8080/
不带"/":(开发中一定不要出现不带"/"的情况).代表从当前目录找.
例如: 表单所在页面路径为==>
http://localhost:8080/Day08-request/info/login.jsp ==> 代表
http://localhost:8080/Day08-request/info/
<url-pattern> /AServlet ==> http://localhost:8080/Day08-request/AServlet
request.getRequestDispatcher("/AServlet") ==>
http://localhost:8080/Day08-request/AServlet
路径写法:
"/": 相对于项目. "/"==>http://localhost:8080/Day08-request/
两个对象 request 和 response 指的是实现了 ServletResponse接口的
HttpServletResponse
2.在response中 存在的方法 响应给客户端
a) 如果一个方法过时了 一般源码有提示信息
效果图 输入www.localhost:80/jw08resq&req/Bservlet 错误
傻瓜式重定向不用明白原理
使用response的一个方法
字节流乱码 utf-------gbk
IS5 9 编码集中不存在中文
字节流 发文本 字符流 发图片或者多媒体信息
8服务器错误
告诉浏览器 服务器输入的文件类型 text/html是关于字符内容类型
“imgae/jpeg” 告诉浏览器 服务器发送过去的是一个图片
告诉浏览器 你发送的字节流 0101 是什么格式的 浏览器去解析 这个文件的是什么类型 image/jpeg
服务器把文件发送个浏览器
//0 告诉浏览器是什么东西(不用手动去类型查文件对象那个是什么)
//getServletContext().getMimeType(".jar") Context对象根据 后缀名去
web.xml查找mime类型.
response.setContentType(getServletContext().getMimeType(".avi"));
//告诉浏览器推荐用户使用什么名称下载 一般选择英文类型
response.setHeader("Content-Disposition", "attachment;filename=java.avi");
//1 获得图片的输入流
InputStream in =
getServletContext().getResourceAsStream("/WEB-INF/03225.avi");
//2 通过response获得输出字节流
OutputStream out = response.getOutputStream();
//3 两个对接
byte[] buffer = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
out.flush();
}
in.close();
out.close();
1.request对象 封装了 浏览器发过来的信息
Request对象
请求首行 请求方式 请求路径 协议/版本号
request.getMethod(): GET
request.getRequestURI(): /Day08-request/AServlet
request.getServletPath(): /AServlet
request.getContextPath(): /Day08-request 获得应用路径 /jw08rr02
request.getScheme(): http
请求头
//--原始方式获得请求头 比较繁琐有key 得到value
String getHeader(String name)
long getDateHeader(String name)
int getIntHeader(String name)
Enumeration getHeaders(String name)
Enumeration getHeaderNames()
//---javaee封装好的方法.
request.getContentLength(): -1
request.getContentType(): null
request.getLocale(): zh_CN zh 中文
request.getQueryString(): name=tom&age=18
request.getRequestURL(): http://localhost:8080/Day08-request/AServlet 绝对路径 网络上的任何资源
request.getRequestURI(): /Day08-request/AServlet 相对路径
request.getRemoteAddr(): 0:0:0:0:0:0:0:1
request.getRemoteHost(): 0:0:0:0:0:0:0:1
request.getRemotePort(): 52074 获得远端 浏览器的
request.getServerName(): localhost
request.getServerPort(): 8080
请求空行
请求正文 表单传送过来的键值对
2.1乱码:只要确保编码和解码一致,就绝对没有问题.
1.浏览器负责编码.浏览器使用的码表就是表单所在页面的码表.
2.服务器负责解码.服务器默认使用ISO-8859-1解码. 但如果你的服务器使用的是utf-8就不用配置了 如下配 置的URIEncoding来决定
解码码表
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" /> 在tomcat servlet .xml 中
如上配置会影响整个服务器不推荐.
我们使用如下代码解决:
//获得参数
String name = request.getParameter("name");
//因为服务器使用了错误的码表,那么我们按照错误的码表原路返回
byte[] nameByte = name.getBytes("ISO-8859-1");
//用正确的码表重新解码
String newName = new String(nameByte,"UTF-8");
System.out.println("解决之后的:"+newName);
因为Post解码是在调用getParameter同时进行解码,那么解决乱码只需要在调用该方法之前设置服务器解码方式
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println(name);
涉及到获得表单参数的方法还有哪些呢?
String getParameter() 根据键获得值
Map getParameterMap() 获得服务器保存表单参数的容器
就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la
for(Entry<String, String[]> en : map.entrySet()){
String key = en.getKey();
String[] value = en.getValue();
System.out.println(key+"==>" +Arrays.toString(value));
}
Enumeration getParameterNames() 获得提交的所有键 列举
while(en.hasMoreElements()){
String key = en.nextElement();
System.out.println("提交上来的键==>"+key);
}
String[] getParameterValues(String name) 根据键获得值.
获得一键对应多 个值的情况的.
System.out.println(Arrays.toString(habits));
//---------------------------------------------------------------------------------------------------------------------
一个Servlet处理完毕交给下面的servlet(JSP)继续处理.
作用:
在现实开发中,没有servlet转发给servlet的情况.都是由servlet转发给JSP.
这样可以达到分工的作用:
servlet: 比较适合处理业务.
JSP: 比较适合显示功能
注意问题:
//servlet中不要做 输出正文的动作,没有结果的
//如果放到前面会出现乱码. 解决 response.serCharacterEncoding(“utf-8”);
字符串 通过 utf-8编码 变为 二进制字节 传输
网页 通过 utf-8编码集 把二进制字节解码
逻辑处理
//1 获得表单提交的用户名密码
String name = request.getParameter("name");
String password = request.getParameter("password");
//2 判断是否正确 tom 1234 才算成功
if(name!=null && name.trim().length()>0 && name.equals("tom")&&
password!=null && password.trim().length()>0 &&
password.equals("1234")){
//成功 ==> 转发到成功页面
request.getRequestDispatcher("/login/success.jsp").forward(request,
response);
//自己来做,很多弊端,不要这样
/* AServlet a = new AServlet();
a.service(request, response);*/
}else{
//失败 ==> 转发到失败页面
request.getRequestDispatcher("/login/error.jsp").forward(request, response);
}
//但是响应头是可以设置的.
两个servlet(jsp)共同向浏览器输出内容.
作用:
在现实开发中,多个页面含有相同的内容,我们把相同的内容抽取到一个jsp中,在需要显示这个段内容的jsp中,包含抽取的jsp.可以达到
统一管理相同的内容.
有不严谨的地方 使用jsp标签来实现
原理:
在request对象中含有一个map.这个map就是request域.
作用:
在将来开发中. 使用请求转发时,servlet处理完数据, 处理结果要交给jsp显示. 可以使用request域将处理结果有servlet带给jsp显示. 共享数据
操作:
1.setAttribute(key,value) 存入一个键值对
2.getAttribute(key) 通过键取出值
3.getAttributeNames() 获得域中所有键
4.removeAttribute(key) 跟据键移除一个键值对
request的范围:
一个request对象对应一个request域(map).
系统当前有多少个request就有多少request域.
//1 获得表单提交的用户名密码
String name = request.getParameter("name");
String password = request.getParameter("password");
//
Map<String,String> error = new HashMap<String, String>();
//2 验证
if(!(name!=null && name.trim().length()>0 && name.equals("tom"))){
error.put("name", "用户名有误!");
}
if(!(password!=null && password.trim().length()>0 && password.equals("1234"))){
error.put("password", "密码错误!");
}
//将错误信息通过request域带到错误页面
request.setAttribute("error",error );
if(error.size() > 0){
//失败==> 回到登录页面,并显示错误信息
request.getRequestDispatcher("/login2/login.jsp").forward(request, response);
}else{
//成功==> 成功页面
request.getRequestDispatcher("/login2/success.jsp").forward(request, response);
}
<body>
<h1>用户登录</h1>
<form action="/Day08-request/HServlet" method="POST">
用户名:<input type="text" name="name" /> <br>
密码:<input type="password" name="password" /><br>
<input type="submit" >
</form>
<%
Map<String,String> error = (Map<String,String>)request.getAttribute("error");
if(error!=null && error.size()>0){
for(Entry<String,String> en : error.entrySet()){
out.print("<font color=‘red‘>");
out.print(en.getValue()+"<br>");
out.print("</font>");
}
}
%>
</body>
//=================================================================================================================
路径分为两种情况:
<form action="/Day08-request/AServlet" >
<a href="/Day08-request/AServlet" >
<img src="/Day08-request/AServlet" >
response.sendRedirect("/Day08-request/AServlet")
Refresh:3;url=/Day08-request/AServlet
路径写法:
带"/" : "/" ==> 相对于 主机.
例如: 表单所在页面路径为==>
http://localhost:8080/Day08-request/login.jsp ==> "/" 代表http://localhost:8080/
不带"/":(开发中一定不要出现不带"/"的情况).代表从当前目录找.
例如: 表单所在页面路径为==>
http://localhost:8080/Day08-request/info/login.jsp ==> 代表
http://localhost:8080/Day08-request/info/
<url-pattern> /AServlet ==> http://localhost:8080/Day08-request/AServlet
request.getRequestDispatcher("/AServlet") ==>
http://localhost:8080/Day08-request/AServlet
路径写法:
"/": 相对于项目. "/"==>http://localhost:8080/Day08-request/
标签:处理 密码 字符流 utf-8 方式 map 自己 版本 ora
原文地址:http://www.cnblogs.com/nextgg/p/7657650.html