1、request对象
*HttpServletRequest 父接口 ServletRequest
*方法
-获取到客户机信息
--获取表单提方式
String getMethod()
--获取到请求地址
StringBuffer getRequestURL() 。
--获取到请求的项目名称
String getContextPath()
--获取道请求的客户端的ip地址
String getRemoteAddr()
-获取到请求的头信息
--使用方法getHeader("头");
Referer User-Agent If-Modified-Since
-获取通过表单提交的数据
-String getParameter(String name)
根据标签name属性的值 ,获取提交的值
-Map<String , String[]> getParameterMap()
获取表单输入项的name的值和输入项的值
-String[] getParameterValues(String name)
针对复选框,获取多个提交的数据,参数是复选框的name属性值
-Enumeration<String> getParameterNames()
获取所有表单输入项name属性的值
-在表单提交中文乱码的问题
--因为request也存在缓冲区,且缓冲区的编码是iso8859-1不支持中文,所以需要设置编码方式。表单提交方式 get post
--post提交方式中文乱码解决方式
setCharacterEncoding("编码方式");
--get提交中文乱码方式
---因为get提交方式会在地址栏,但是输入的内容会被进行编码,所以获取的时候是乱码
---三种解决方式:
**在tomcat里面配置
找到conf下server.xml
-配置端口的地方,最后加属性URLEncoding="utf-8"(不建议用)
**首先先对中文编码,到servlet里面解码(逆向编解码)
username = URLEncoder.encode(username,"iso8859-1")
username = URLEncoder.decode(username,"utf-8")
**使用String构造方法编码转换(常用)
username = new String(username.getByte("iso8859-1"),"utf-8")
--乱码总结:
**向页面输出中文乱码
-字节流
设置浏览器编码和字节数组的编码一致
--字符流
设置response缓冲区的编码和浏览器编码一致
**获取表单提交的数据中文乱码
--post
设置request缓冲区的编码
--get
**String构造函数完成转换
**配置tomcat配置
**编码解码
-request是一个域对象
--在一定的范围内可以存值和取值。
ServletContext域:整个项目
setAttribute()
getAttribute()
--request域
范围:一次请求
setAttribute()
getAttribute()
request域对象经常和转发一起使用
request.getRequestDispatcher("不带项目名称的转发路径").forward();
--创建Demo1的servlet的request域色设置一个值,msg itcast, 获取,通过demo2的request域获取设置的值
**代码演示
--Demo1 Servlet
/**
*通过demo1的request域设置一个值
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置值
request.setAttribute("msg", "xia");
//转发到damo2
// request.getRequestDispatcher("/Demo2").forward(request, response);
//重定向
// response.sendRedirect("/day09/Demo2");
}
--Demo2 Servlet
/**
*获取通过demo1里面设置的值
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取值
response.getWriter().print(request.getAttribute("msg"));
}
-转发和重定向
--转发:在服务器内部进行的转发, 在地址栏访问的时候,地址栏不会跳转 ,而是服务器内部会进行相应的转发操作,注意区别重定向。写路径的时候不需要写项目的名称,因为是在内部进行转发的,所以不到外层。
request.getRequestDispatcher("/Demo2").forward(request, response);
--重定向:通过浏览器访问, 地址栏访问时,会进行跳转。 因为重定向会指向新的地址即重新发送请求,写路径的时候需要写项目名称。
response.sendRedirect("/day09/response/Login.html");
--对比两个的区别,从代码路径可以看出,具体理解转发和重定向的区别
-重定向和转发区别
--在一个请求里面,又做了一次请求
--重定向:比如找小文借钱10万,小文没有钱,告诉我小温有钱,我再去找小温,把钱拿到
---请求两次,响应两次
--转发:比如找张三借钱,但是张三没有钱,张三去帮我找李四借钱,最终把钱给我
---请求一次,响应一次
*代码演示
-方法演示
/**
*实现获取表单提交的数据
*@author xiayujie
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
private void test1(HttpServletRequest request) throws Exception{
String username = request.getParameter("username");
System.out.println("GET中文乱码解决:"+new String(username.getBytes("ISO8859-1"),"utf-8"));
}
private void test(HttpServletRequest request)
throws UnsupportedEncodingException {
System.out.println("获取客户机信息-------------------------------------------------");
//获取客户机信息
//获取请求的方式
System.out.println(request.getMethod());
//获取项目名称
System.out.println(request.getContextPath());
//获取请求地址
System.out.println(request.getRequestURI());
System.out.println(request.getHeader("Referer"));
//获取ip
System.out.println(request.getRemoteAddr());
System.out.println(request.getRemoteHost());
System.out.println("获取请求的头信息-------------------------------------------------");
//获取请求的头信息
String referer = request.getHeader("Referer");
String useragent = request.getHeader("User-Agent");
String ifModifiedSince = request.getHeader("If-Modified-Since");
System.out.println(referer);
System.out.println(useragent);
System.out.println(ifModifiedSince);
System.out.println("获取表单提交信息-------------------------------------------------");
//使用getParameter()
//request获取通过post提交的数据,会把数据放到request缓冲区里面
//request缓冲区默认编码四iso8859-1和response缓冲区的编码一致
//所以需要把request缓冲区编码设置一下
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
System.out.println(username);
//获取复选框的值getParameterValues()
String[] s = request.getParameterValues("love");
System.out.println(Arrays.toString(s));
//获取表单输入项的name和输入的值getParameterMap()
Map<String,String[]> map = request.getParameterMap();
Set<Entry<String, String[]>> set = map.entrySet();
for (Entry<String, String[]> entry : set) {
String key = entry.getKey();
String[] value = entry.getValue();
System.out.println(key+" : "+Arrays.toString(value));
}
/*
Set<String> keySet = map.keySet();
Iterator<String> it = keySet.iterator();
while(it.hasNext())
{
String key = it.next();
String[] value = map.get(key);
System.out.println(key+" : "+Arrays.toString(value));
}*/
}
/**
*
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
2、使用转发完成 登录操作
*如果用户名或者密码错误,回到登录页面,但是携带错误提示在登录页面显示出来
*引入知识点:
jsp:sun公司提供用于开发动态网站的技术 servlet
el表达式:获取域对象里面的值
语法:${域对象名称}
*代码演示
--RequestDemo3
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
if("admin".equals(username) && "123456".equals(password))
{
response.getWriter().write("SUCCESS!");
}
else
{
//向request页面域里面设置一个值
request.setAttribute("msg1", "用户名或密码错误!");
//转发到登录页面
request.getRequestDispatcher("/request/login.jsp").forward(request, response);
}
}
--login.jsp
<body>
<h1>Login Page</h1>
<form action="/day09/RequestDemo3" method="post">
username:<input type="text" name="username"/><br>
password:<input type="password" name="password"/><br>
<input type="submit" value="login"/>
</form>
<h2><font color="red">${msg1}</font></h2>
</body>
3、debug调试web项目
*需要在tomcat启动的位置旁边的小蜘蛛 debug server,才可以进行调试