您的位置:首页 > 编程语言 > Java开发

javaWeb核心技术二

2016-12-23 01:08 239 查看
第01章:Request【全称为HttpServletRequest】入门

1.01 什么是Request对象

     客户端向服务器发送请求时,所有客户端信息都封装在Request对象中,

我们可以通过Request对象来获取客户端相关信息。

 

 

第02章:Request常用API

2.01 获取客户机信息

  getRequestURL()方法返回客户端发出请求时的完整URL

getRequestURI()方法返回请求行中的资源名部分

getQueryString()方法返回请求行中的参数部分

getRemoteAddr()方法返回发出请求的客户机的IP地址

getLocalAddr()方法返回WEB服务器的IP地址

getMethod()方法返回客户机请求方式 GETPOST

getContextPath()方法返回当前web应用根目录

getServletPath()方法返回Servlet映射路径

2.02 获取请求头信息

getHeader(User-Agent)方法返回请求头的值

2.03 获取请求体参数

getParameter()方法通过name获得值

getParameterValues()方法通过name获得多值

getParameterNames()方法获得所有name

 Demo01.java

/**
 * 用以下网址访问:
 * http://127.0.0.1:8080/day12/Demo01?id=2016&name=zhaojun  */
public
class
Demo01 extends HttpServlet {
     public
void
doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
           //如:http://127.0.0.1:8080/day12/Demo01
           String url = request.getRequestURL().toString();//方法返回客户端发出请求时的完整URL

           //如:/day12/Demo01
           String uri = request.getRequestURI();//方法返回请求行中的资源名部分
           //如:id=2016&name=zhaojun
           String queryString = request.getQueryString();//方法返回请求行中的参数部分
           //如:127.0.0.1
           String remoteAddr = request.getRemoteAddr();//方法返回发出请求的客户机的IP地址
           //如:127.0.0.1
           String localAddr = request.getLocalAddr();//方法返回web服务器的IP地址
           //如:GET
           String method = request.getMethod();//方法返回客户机请求方式 GET或POST
           //如:/day12
           String contextPath = request.getContextPath();//方法返回当前web应用根目录
           //如:/Demo01
           String servletPath = request.getServletPath();//方法返回Servlet映射路径,即<url-pattern>
           //如:参见下面注释
           Enumeration<String> enums = request.getHeaderNames();//获取所有请求头
           while(enums.hasMoreElements()){
                String key = enums.nextElement();
                String value = request.getHeader(key);
                System.out.println(key+"-"+value);
           }
           System.out.println(url);
           System.out.println(uri);
           System.out.println(queryString);
           System.out.println(remoteAddr);
           System.out.println(localAddr);
           System.out.println(method);
           System.out.println(contextPath);
           System.out.println(servletPath);
           /*
           accept-text/html, application/xhtml+xml,
           accept-language-zh-CN
           user-agent-Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Win64; x64;
Trident/6.0)
           ua-cpu-AMD64
           accept-encoding-gzip,
deflate
           host-127.0.0.1:8080
           dnt-1
           connection-Keep-Alive
           */
     }
}

 

 

第03章:表单提交中文乱码的原因和解决方案

3.01 为什么表单中有中文,会出现乱码呢?

      画图分析

      代码演示

 3.02 解决方案

通用方式:适用于GET和POST

byte[] buf =username.getBytes(“ISO8859-1”);按ISO8859-1编码

          String username = new String(buf,”UTF-8”);按UTF-8解码

专用方式:适用于POST

         request.setCharacterEncoding(“UTF-8”);针对请求体内容按UTF-8编码

         request.getParameter(“username”)

      如果项目中GET和POST业务功能相同的话,可以在doGet()方法中调用doPost()

 01_register.html

<!DOCTYPE
html PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta
http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<title>注册表单</title>
</head>
<body>
    <!-- /表示webapps目录-->
    <form
action="/day12/Demo02"
method="POST">
        <table
border="2"
align="center">
             <tbody>
                 <tr>
                     <td>用户名</td>
                     <td><input
type="text"
name="username"
value="哈哈"/></td>
                 </tr>
                 <tr>
                     <td>密码</td>
                     <td><input
type="password"
name="password"
value="123456"/></td>
                 </tr>
                 <tr>
                     <td>性别</td>
                     <td>
                         <input
type="radio"
name="gender"
value="男"
checked="checked"/>男
                         <input
type="radio"
name="gender"
value="女"/>女
                     </td>
                 </tr>
                 <tr>
                     <td>爱好</td>
                     <td>
                         <input
type="checkbox"
name="like"
value="打球"/>打球
                         <input
type="checkbox"
name="like"
value="看电视"/>看电视
                         <input
type="checkbox"
name="like"
value="上网"/>上网
                         <input
type="checkbox"
name="like"
value="收藏"
checked="checked"/>收藏
                     </td>
                 </tr>
                 <tr>
                     <td>选择上传的文件</td>
                     <td>
                         <input
type="file"
name="upload"/>
                     </td>
                 </tr>
                
                 <tr>
                     <td>选择你想就业的城市</td>
                     <td>
                         <select
name="city">
                             <option
value="北京">北京</option>
                             <option
value="上海">上海</option>
                             <option
value="深圳">深圳</option>
                             <option
value="广州"
selected="selected">广州</option>
                             <option
value="杭州">杭州</option>
                         </select>
                     </td>
                 </tr>
                 <tr>
                     <td><input
type="submit"
value="提交按钮"/></td>
                     <td><input
type="reset"
value="重填按钮"/></td>
                 </tr>
             </tbody>
        </table>
    </form>
</body>
</html>

 Demo02.java

 public
class
Demo02 extends HttpServlet {
     protected
void
doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
           this.doPost(request,response);
     }
     protected
void
doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
//POST请求下,将request请求体中的内容按UTF-8编码
           request.setCharacterEncoding("UTF-8");
           // 分别根据表单项名获取对应的表单值,按UTF-8解码,采用字符集同上
           String username = request.getParameter("username");
           String password = request.getParameter("password");
           String gender = request.getParameter("gender");
           String[] likes = request.getParameterValues("like");
           String upload = request.getParameter("upload");
          String city = request.getParameter("city");
           // 提示
           System.out.println(username);
           System.out.println(password);
           System.out.println(gender);
           for (String like : likes) {
                System.out.print(like +
"  ");
           }
           System.out.println("\n" +
upload);
           System.out.println(city);
     }
}

 web.xml

<servlet>
    <servlet-name>Demo02</servlet-name>
    <servlet-class>cn.itheima.request.Demo02</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Demo02</servlet-name>
    <url-pattern>/Demo02</url-pattern>
</servlet-mapping>

 

 

第04章:Request域对象

4.01 什么是域对象

     域对象初学者可以理解为一个容器,可以暂存String-Object这种key-value形式的数据

     域对象保存时间是不同的,有的域对象保存时间在一次请求中;有的域对象保存时间在一次会话中;

     有的域对象保存时间在整个应用中。其中Request域对象保存时间只在一次请求中,也就是说

     一次请求完毕后,Request域对象就销毁了,一旦Request域对象销毁,那么存在其中的数据也

     就不存在了。

4.02 为什么需要域对象

     有时我们的业务,一个Servlet完成不了,需要另一个Servlet帮忙,这就是说,

我们需要在二个或多个Servlet之间传递数据,域对象就负责完成这项任务

4.03  Request对象有二层含义:

 01——代表客户端向服务器的请求对象,如getParameter(“username”)

02——代表可以暂存数据的域对象,如下如示API

4.04  Request作为域对象常用的API

setAttribute():向域对象中绑定key=value形式的数据

getAttribute():从域对象中根据key找value,如果取到不到,返回NULL 

removeAttribute():从域对象中删除key对应的value

Request何时创建:

一次请求来到Servlet

Request何时销毁:

              服务器将内容响应到客户端后,Request就销毁

            

 

 

 Demo03.java

public
class
Demo03 extends HttpServlet {
     public
void
doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
           //从Request对象中根据key取出User对象
           User user = (User) request.getAttribute("USER");
           //将User对象中的内容在浏览器中显示
           response.setContentType("text/html;charset=UTF-8");
           PrintWriter pw = response.getWriter();
           pw.write(user.getUsername()+"<br/>");
           pw.write(user.getPassword()+"<br/>");
           pw.write(user.getGender()+"<br/>");
           pw.write(user.getUpload()+"<br/>");
           pw.write(user.getCity()+"<br/>");
           for(String like : user.getLikes()){
                pw.write(like+"\t");
           }
           pw.flush();
           pw.close();
     }
}

 

 

第05章:Request转发

5.01 多个Servlet配合工作

     有些时候,一个Servlet不能很好的完成业务工作,需要另一

     个Servlet来配合。这就是说,很有可能一个Servlet需要将

流程交由另一个Servlet,此时就要用转发或重定向这二个

     技术了,这里我们谈Request转发。

5.02 要转发必须得用Request.getRequestDispatcher().forward()方法

 Demo02.java

public
class
Demo02 extends HttpServlet {
     public
void
doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
           //POST请求下,将request请求体中的内容按UTF-8编码
           request.setCharacterEncoding("UTF-8");
           // 分别根据表单项名获取对应的表单值,按UTF-8解码,采用字符集同上
           String username = request.getParameter("username");
           String password = request.getParameter("password");
           String gender = request.getParameter("gender");
           String[] likes = request.getParameterValues("like");
           String upload = request.getParameter("upload");
           String city = request.getParameter("city");
           //创建User对象
           User user = new User();
           user.setUsername(username);
           user.setPassword(password);
           user.setGender(gender);
           user.setLikes(likes);
           user.setUpload(upload);
           user.setCity(city);
           //将User对象以key=value形式绑定到Request对象中
           request.setAttribute("USER",user);
           //将流程转发到Demo03.java继续处理,/表示当前web应用名或web应用根目录
           request.getRequestDispatcher("/Demo03").forward(request,response);
     }
}

5.03 转发是服务器内部的事,与浏览器无关,所以浏览器的地址栏不会变,

原来浏览器以什么方式提交数据,转发到另一个Servlet依然执行对应的

doXxx方法。画图解释

浏览器以POST提交---à第一个Servlet::doPost---à第二个Servlet::doPost

浏览器以GET提交---à第一个Servlet::doGet---à第二个Servlet::doGet

注意:转发不限于Servlet之间,Servlet也可以转发到HTML和JSP页面

 

 

第06章:Response【全称为HttpServletResponse】入门

6.01 什么是Response对象

     服务器向客户端发送响应时,必须通过Response对象,因此想向客户端输出数据,

就要会用Response对象

 

 

第07章:Response常用的API

7.01 设置响应头,制作浏览器

     setHeader(key,value)

7.02 获取字符输出流

      getWriter():返回PrintWriter

        适合:向浏览器输出内容,用字符

7.03 获取字节输出流

     getOutputStream():返回ServletOutputStream

        适合:向客户端输出多媒体文件,用字节

Demo04.java

public
class
Demo04 extends HttpServlet {
     protected
void
doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
           //this.useByte(request,response);
           this.useChar(request,response);
     }
     /**
      * 以字符方式输出中,英,数,
      */
     private
void
useChar(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
           response.setHeader("content-type","text/html;charset=UTF-8");//浏览器解码
           response.setCharacterEncoding("UTF-8");//服务器编码
           PrintWriter pw = response.getWriter();
           pw.write("美国<br/>");
           pw.write("USA<br/>");
           pw.write(99);
           pw.flush();
           pw.close();    }
     /**
      * 以字节方式输出中,英,数,
      */
     private
void
useByte(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
           response.setHeader("content-type","text/html;charset=UTF-8");
          OutputStream os = response.getOutputStream();
           os.write("中国<br/>".getBytes("UTF-8"));
           os.write("CHINA<br/>".getBytes("UTF-8"));
           os.write(98);
           os.flush();
           os.close();   
}
}

注意:一个Respnse对象不能同时用字符和字节输出;

要么都用字符输出,要么都用字节输出。

 

 

第08章:浏览器输出中文乱码的原因和解决方案

8.01 Response向浏览器输出中文乱码的原因:

    字符:

response.getWriter().write("哈哈");

默认按ISO8859-1编码,浏览器默认按GB2312解码

    字节:

response.getOutputStream().write("呵呵".getBytes());

默认按GB2312编码,浏览器默认按GB2312解码,

我们是window平台,window平台默认GB2312的编码和解码

8.02 解决方案:

    字符: 

                         response.setHeader("content-type","text/html;charset=UTF-8");//浏览器解码
               response.setCharacterEncoding("UTF-8");//服务器编码

               以上二句代码,可以合二为一,如下:

response.setContentType("text/html;charset=UTF-8");

服务器按UTF-8编码,浏览器按UTF-8解码

确保编码解码相同

一:服务器输出的内容采用UTF-8来编码

二:通知浏览器接收什么类型的数据

三:通知浏览器用UTF-8来解码

                       response.getWriter().write("哈哈");

    字节:

                     response.setHeader("content-type","text/html;charset=UTF-8");

浏览器按UTF-8解码

                    response.getOutputStream().write("呵呵".getBytes("UTF-8"));

服务器按UTF-8解码

 下载文件Demo05.java:

 <!-- /表示webapps目录 -->
 <a

      href="/day12/Demo05?fileName=%E4%B8%8A%E6%B5%B7%E5%9C%B0%E9%93%81%E5%9B%BE.gif"

      style="text-decoration:none;">河源万绿湖.gif</a>

public
class
Demo05 extends HttpServlet {
     public
void
doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
           String fileName = request.getParameter("fileName");
           byte[] buf = fileName.getBytes("ISO8859-1");
           fileName = new String(buf,"UTF-8");
           System.out.println("你要下载的文件名为:" + fileName);
          
           response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
          
           InputStream is = this.getServletContext().getResourceAsStream("/images/河源万绿湖.gif");
           OutputStream os = response.getOutputStream();
           byte[] data =
new byte[1024*3];
           int len = 0;
           while((len=is.read(data))>0){
                os.write(data,0,len);
           }
           os.close();
           is.close();
     }
     /*
     public static void main(String[]
args) throws Exception{
           String fileName = URLEncoder.encode("河源万绿湖.gif","UTF-8");
           System.out.println(fileName);
     }
     */
}
 

 

第09章:Response重定向

9.01 多个Servlet配合工作

     有些时候,一个Servlet不能很好的完成业务工作,需要另一

     个Servlet来配合。这就是说,很有可能一个Servlet需要将

流程交由另一个Servlet,此时就要用转发或重定向这二个

     技术了,这里我们谈Response重定向。

9.02 要重定向必须得用Response.sendRedirect()方法

9.03 重定向是客户端与服务器的共同行为,不是服务器内部行为,所以浏览器的地址栏会变化

9.04 位于/WEB-INF这个私有目录下的资源,只能通过转发才可访问,重定向是不能访问的

注意:重定向不限于Servlet之间,Servlet也可以重定向到HTML和JSP页面

用户登录:

03_login.html

<!DOCTYPE
HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>03_login.html</title>
    <meta
http-equiv="keywords"
content="keyword1,keyword2,keyword3">
    <meta
http-equiv="description"
content="this is my page">
    <meta
http-equiv="content-type"
content="text/html; charset=UTF-8">
  </head>
  <body>
    <form
action="/day12/Demo06"
method="POST">
           <table
border="2"
align="center">
                <tbody>
                     <tr>
                          <td>用户名</td>
                          <td><input
type="text"
name="username"
value="哈哈"
maxlength="4"/></td>
                     </tr>
                     <tr>
                          <td>密码</td>
                          <td><input
type="password"
name="password"
value="123456"
maxlength="6"/></td>
                     </tr>
                     <tr>
                          <td
colspan="2"
align="center">
                                <input
type="submit"
value="提交"
style="width:111px"/>
                          </td>
                     </tr>
           </table>
     </form>
  </body>
</html>
 

Demo06.java

public
class
Demo06 extends HttpServlet {
     public
void
doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
           request.setCharacterEncoding("UTF-8");
           String username = request.getParameter("username");
           String password = request.getParameter("password");
           if("赵君".equals(username) &&
"123456".equals(password)){
                response.sendRedirect(request.getContextPath()+"/04_welcome.html");
           }else{
                response.sendRedirect(request.getContextPath()+"/05_error.html");
           }
     }
}

05_error.html

<!DOCTYPE
HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>05_error.html</title>
    <meta
http-equiv="keywords"
content="keyword1,keyword2,keyword3">
    <meta
http-equiv="description"
content="this is my page">
    <meta
http-equiv="content-type"
content="text/html; charset=UTF-8">
    <!--
    <meta http-equiv="refresh" content="5;url=03_login.html">
     -->
  </head>
  <body>
     <font
style="font-size:66;color:green;">出错了,<span
id="timeID">5</span>秒后,回到登录页面</font>
    
     <script
type="text/javascript">
           function
updateTime(){
                var
span = document.getElementById("timeID");
                var
strTime = span.innerHTML;
                var
time = parseInt(strTime);
                if(time>1){
                     time--;
                     span.innerHTML = time;
                }else{
                     var
url = "http://127.0.0.1:8080/day12/03_login.html";
                     window.location.href = url;
                }
           }
           window.setInterval("updateTime()",1000);
     </script>
  </body>
</html>

03_welcome.html

<!DOCTYPE
HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>03_welcome.html</title>
    <meta
http-equiv="keywords"
content="keyword1,keyword2,keyword3">
    <meta
http-equiv="description"
content="this is my page">
    <meta
http-equiv="content-type"
content="text/html; charset=UTF-8">
  </head>
  <body>
     <font
style="font-size:66;color:green;">欢迎光临</font>
  </body>
</html>

 

 

 

 

 

附加:总结一下”/”表示什么

01——<a href=”/”>:表示webapps目录

02——<imgsrc=”/”>:表示webapps目录

03——<formaction=”/”>:表示webapps目录

04——request.getRequestDispatcher(“/”).forward():表示当前WEB应用的名,即day12

05——response.sendRedirect(“/”):表示webapps目录

 

 

 

 

 

 第01章:Request【全称为HttpServletRequest】入门

1.01 什么是Request对象

     客户端向服务器发送请求时,所有客户端信息都封装在Request对象中,

我们可以通过Request对象来获取客户端相关信息。

 

 

第02章:Request常用API

2.01 获取客户机信息

  getRequestURL()方法返回客户端发出请求时的完整URL

getRequestURI()方法返回请求行中的资源名部分

getQueryString()方法返回请求行中的参数部分

getRemoteAddr()方法返回发出请求的客户机的IP地址

getLocalAddr()方法返回WEB服务器的IP地址

getMethod()方法返回客户机请求方式 GETPOST

getContextPath()方法返回当前web应用根目录

getServletPath()方法返回Servlet映射路径

2.02 获取请求头信息

getHeader(User-Agent)方法返回请求头的值

2.03 获取请求体参数

getParameter()方法通过name获得值

getParameterValues()方法通过name获得多值

getParameterNames()方法获得所有name

 Demo01.java

/**
 * 用以下网址访问:
 * http://127.0.0.1:8080/day12/Demo01?id=2016&name=zhaojun  */
public
class
Demo01 extends HttpServlet {
     public
void
doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
           //如:http://127.0.0.1:8080/day12/Demo01
           String url = request.getRequestURL().toString();//方法返回客户端发出请求时的完整URL

           //如:/day12/Demo01
           String uri = request.getRequestURI();//方法返回请求行中的资源名部分
           //如:id=2016&name=zhaojun
           String queryString = request.getQueryString();//方法返回请求行中的参数部分
           //如:127.0.0.1
           String remoteAddr = request.getRemoteAddr();//方法返回发出请求的客户机的IP地址
           //如:127.0.0.1
           String localAddr = request.getLocalAddr();//方法返回web服务器的IP地址
           //如:GET
           String method = request.getMethod();//方法返回客户机请求方式 GET或POST
           //如:/day12
           String contextPath = request.getContextPath();//方法返回当前web应用根目录
           //如:/Demo01
           String servletPath = request.getServletPath();//方法返回Servlet映射路径,即<url-pattern>
           //如:参见下面注释
           Enumeration<String> enums = request.getHeaderNames();//获取所有请求头
           while(enums.hasMoreElements()){
                String key = enums.nextElement();
                String value = request.getHeader(key);
                System.out.println(key+"-"+value);
           }
           System.out.println(url);
           System.out.println(uri);
           System.out.println(queryString);
           System.out.println(remoteAddr);
           System.out.println(localAddr);
           System.out.println(method);
           System.out.println(contextPath);
           System.out.println(servletPath);
           /*
           accept-text/html, application/xhtml+xml,
           accept-language-zh-CN
           user-agent-Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Win64; x64;
Trident/6.0)
           ua-cpu-AMD64
           accept-encoding-gzip,
deflate
           host-127.0.0.1:8080
           dnt-1
           connection-Keep-Alive
           */
     }
}

 

 

第03章:表单提交中文乱码的原因和解决方案

3.01 为什么表单中有中文,会出现乱码呢?

      画图分析

      代码演示

 3.02 解决方案

通用方式:适用于GET和POST

byte[] buf =username.getBytes(“ISO8859-1”);按ISO8859-1编码

          String username = new String(buf,”UTF-8”);按UTF-8解码

专用方式:适用于POST

         request.setCharacterEncoding(“UTF-8”);针对请求体内容按UTF-8编码

         request.getParameter(“username”)

      如果项目中GET和POST业务功能相同的话,可以在doGet()方法中调用doPost()

 01_register.html

<!DOCTYPE
html PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta
http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<title>注册表单</title>
</head>
<body>
    <!-- /表示webapps目录-->
    <form
action="/day12/Demo02"
method="POST">
        <table
border="2"
align="center">
             <tbody>
                 <tr>
                     <td>用户名</td>
                     <td><input
type="text"
name="username"
value="哈哈"/></td>
                 </tr>
                 <tr>
                     <td>密码</td>
                     <td><input
type="password"
name="password"
value="123456"/></td>
                 </tr>
                 <tr>
                     <td>性别</td>
                     <td>
                         <input
type="radio"
name="gender"
value="男"
checked="checked"/>男
                         <input
type="radio"
name="gender"
value="女"/>女
                     </td>
                 </tr>
                 <tr>
                     <td>爱好</td>
                     <td>
                         <input
type="checkbox"
name="like"
value="打球"/>打球
                         <input
type="checkbox"
name="like"
value="看电视"/>看电视
                         <input
type="checkbox"
name="like"
value="上网"/>上网
                         <input
type="checkbox"
name="like"
value="收藏"
checked="checked"/>收藏
                     </td>
                 </tr>
                 <tr>
                     <td>选择上传的文件</td>
                     <td>
                         <input
type="file"
name="upload"/>
                     </td>
                 </tr>
                
                 <tr>
                     <td>选择你想就业的城市</td>
                     <td>
                         <select
name="city">
                             <option
value="北京">北京</option>
                             <option
value="上海">上海</option>
                             <option
value="深圳">深圳</option>
                             <option
value="广州"
selected="selected">广州</option>
                             <option
value="杭州">杭州</option>
                         </select>
                     </td>
                 </tr>
                 <tr>
                     <td><input
type="submit"
value="提交按钮"/></td>
                     <td><input
type="reset"
value="重填按钮"/></td>
                 </tr>
             </tbody>
        </table>
    </form>
</body>
</html>

 Demo02.java

 public
class
Demo02 extends HttpServlet {
     protected
void
doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
           this.doPost(request,response);
     }
     protected
void
doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
//POST请求下,将request请求体中的内容按UTF-8编码
           request.setCharacterEncoding("UTF-8");
           // 分别根据表单项名获取对应的表单值,按UTF-8解码,采用字符集同上
           String username = request.getParameter("username");
           String password = request.getParameter("password");
           String gender = request.getParameter("gender");
           String[] likes = request.getParameterValues("like");
           String upload = request.getParameter("upload");
          String city = request.getParameter("city");
           // 提示
           System.out.println(username);
           System.out.println(password);
           System.out.println(gender);
           for (String like : likes) {
                System.out.print(like +
"  ");
           }
           System.out.println("\n" +
upload);
           System.out.println(city);
     }
}

 web.xml

<servlet>
    <servlet-name>Demo02</servlet-name>
    <servlet-class>cn.itheima.request.Demo02</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Demo02</servlet-name>
    <url-pattern>/Demo02</url-pattern>
</servlet-mapping>

 

 

第04章:Request域对象

4.01 什么是域对象

     域对象初学者可以理解为一个容器,可以暂存String-Object这种key-value形式的数据

     域对象保存时间是不同的,有的域对象保存时间在一次请求中;有的域对象保存时间在一次会话中;

     有的域对象保存时间在整个应用中。其中Request域对象保存时间只在一次请求中,也就是说

     一次请求完毕后,Request域对象就销毁了,一旦Request域对象销毁,那么存在其中的数据也

     就不存在了。

4.02 为什么需要域对象

     有时我们的业务,一个Servlet完成不了,需要另一个Servlet帮忙,这就是说,

我们需要在二个或多个Servlet之间传递数据,域对象就负责完成这项任务

4.03  Request对象有二层含义:

 01——代表客户端向服务器的请求对象,如getParameter(“username”)

02——代表可以暂存数据的域对象,如下如示API

4.04  Request作为域对象常用的API

setAttribute():向域对象中绑定key=value形式的数据

getAttribute():从域对象中根据key找value,如果取到不到,返回NULL 

removeAttribute():从域对象中删除key对应的value

Request何时创建:

一次请求来到Servlet

Request何时销毁:

              服务器将内容响应到客户端后,Request就销毁

            

 

 

 Demo03.java

public
class
Demo03 extends HttpServlet {
     public
void
doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
           //从Request对象中根据key取出User对象
           User user = (User) request.getAttribute("USER");
           //将User对象中的内容在浏览器中显示
           response.setContentType("text/html;charset=UTF-8");
           PrintWriter pw = response.getWriter();
           pw.write(user.getUsername()+"<br/>");
           pw.write(user.getPassword()+"<br/>");
           pw.write(user.getGender()+"<br/>");
           pw.write(user.getUpload()+"<br/>");
           pw.write(user.getCity()+"<br/>");
           for(String like : user.getLikes()){
                pw.write(like+"\t");
           }
           pw.flush();
           pw.close();
     }
}

 

 

第05章:Request转发

5.01 多个Servlet配合工作

     有些时候,一个Servlet不能很好的完成业务工作,需要另一

     个Servlet来配合。这就是说,很有可能一个Servlet需要将

流程交由另一个Servlet,此时就要用转发或重定向这二个

     技术了,这里我们谈Request转发。

5.02 要转发必须得用Request.getRequestDispatcher().forward()方法

 Demo02.java

public
class
Demo02 extends HttpServlet {
     public
void
doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
           //POST请求下,将request请求体中的内容按UTF-8编码
           request.setCharacterEncoding("UTF-8");
           // 分别根据表单项名获取对应的表单值,按UTF-8解码,采用字符集同上
           String username = request.getParameter("username");
           String password = request.getParameter("password");
           String gender = request.getParameter("gender");
           String[] likes = request.getParameterValues("like");
           String upload = request.getParameter("upload");
           String city = request.getParameter("city");
           //创建User对象
           User user = new User();
           user.setUsername(username);
           user.setPassword(password);
           user.setGender(gender);
           user.setLikes(likes);
           user.setUpload(upload);
           user.setCity(city);
           //将User对象以key=value形式绑定到Request对象中
           request.setAttribute("USER",user);
           //将流程转发到Demo03.java继续处理,/表示当前web应用名或web应用根目录
           request.getRequestDispatcher("/Demo03").forward(request,response);
     }
}

5.03 转发是服务器内部的事,与浏览器无关,所以浏览器的地址栏不会变,

原来浏览器以什么方式提交数据,转发到另一个Servlet依然执行对应的

doXxx方法。画图解释

浏览器以POST提交---à第一个Servlet::doPost---à第二个Servlet::doPost

浏览器以GET提交---à第一个Servlet::doGet---à第二个Servlet::doGet

注意:转发不限于Servlet之间,Servlet也可以转发到HTML和JSP页面

 

 

第06章:Response【全称为HttpServletResponse】入门

6.01 什么是Response对象

     服务器向客户端发送响应时,必须通过Response对象,因此想向客户端输出数据,

就要会用Response对象

 

 

第07章:Response常用的API

7.01 设置响应头,制作浏览器

     setHeader(key,value)

7.02 获取字符输出流

      getWriter():返回PrintWriter

        适合:向浏览器输出内容,用字符

7.03 获取字节输出流

     getOutputStream():返回ServletOutputStream

        适合:向客户端输出多媒体文件,用字节

Demo04.java

public
class
Demo04 extends HttpServlet {
     protected
void
doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
           //this.useByte(request,response);
           this.useChar(request,response);
     }
     /**
      * 以字符方式输出中,英,数,
      */
     private
void
useChar(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
           response.setHeader("content-type","text/html;charset=UTF-8");//浏览器解码
           response.setCharacterEncoding("UTF-8");//服务器编码
           PrintWriter pw = response.getWriter();
           pw.write("美国<br/>");
           pw.write("USA<br/>");
           pw.write(99);
           pw.flush();
           pw.close();    }
     /**
      * 以字节方式输出中,英,数,
      */
     private
void
useByte(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
           response.setHeader("content-type","text/html;charset=UTF-8");
          OutputStream os = response.getOutputStream();
           os.write("中国<br/>".getBytes("UTF-8"));
           os.write("CHINA<br/>".getBytes("UTF-8"));
           os.write(98);
           os.flush();
           os.close();   
}
}

注意:一个Respnse对象不能同时用字符和字节输出;

要么都用字符输出,要么都用字节输出。

 

 

第08章:浏览器输出中文乱码的原因和解决方案

8.01 Response向浏览器输出中文乱码的原因:

    字符:

response.getWriter().write("哈哈");

默认按ISO8859-1编码,浏览器默认按GB2312解码

    字节:

response.getOutputStream().write("呵呵".getBytes());

默认按GB2312编码,浏览器默认按GB2312解码,

我们是window平台,window平台默认GB2312的编码和解码

8.02 解决方案:

    字符: 

                         response.setHeader("content-type","text/html;charset=UTF-8");//浏览器解码
               response.setCharacterEncoding("UTF-8");//服务器编码

               以上二句代码,可以合二为一,如下:

response.setContentType("text/html;charset=UTF-8");

服务器按UTF-8编码,浏览器按UTF-8解码

确保编码解码相同

一:服务器输出的内容采用UTF-8来编码

二:通知浏览器接收什么类型的数据

三:通知浏览器用UTF-8来解码

                       response.getWriter().write("哈哈");

    字节:

                     response.setHeader("content-type","text/html;charset=UTF-8");

浏览器按UTF-8解码

                    response.getOutputStream().write("呵呵".getBytes("UTF-8"));

服务器按UTF-8解码

 下载文件Demo05.java:

 <!-- /表示webapps目录 -->
 <a

      href="/day12/Demo05?fileName=%E4%B8%8A%E6%B5%B7%E5%9C%B0%E9%93%81%E5%9B%BE.gif"

      style="text-decoration:none;">河源万绿湖.gif</a>

public
class
Demo05 extends HttpServlet {
     public
void
doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
           String fileName = request.getParameter("fileName");
           byte[] buf = fileName.getBytes("ISO8859-1");
           fileName = new String(buf,"UTF-8");
           System.out.println("你要下载的文件名为:" + fileName);
          
           response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
          
           InputStream is = this.getServletContext().getResourceAsStream("/images/河源万绿湖.gif");
           OutputStream os = response.getOutputStream();
           byte[] data =
new byte[1024*3];
           int len = 0;
           while((len=is.read(data))>0){
                os.write(data,0,len);
           }
           os.close();
           is.close();
     }
     /*
     public static void main(String[]
args) throws Exception{
           String fileName = URLEncoder.encode("上海地铁图.gif","UTF-8");
           System.out.println(fileName);
     }
     */
}
 

 

第09章:Response重定向

9.01 多个Servlet配合工作

     有些时候,一个Servlet不能很好的完成业务工作,需要另一

     个Servlet来配合。这就是说,很有可能一个Servlet需要将

流程交由另一个Servlet,此时就要用转发或重定向这二个

     技术了,这里我们谈Response重定向。

9.02 要重定向必须得用Response.sendRedirect()方法

9.03 重定向是客户端与服务器的共同行为,不是服务器内部行为,所以浏览器的地址栏会变化

9.04 位于/WEB-INF这个私有目录下的资源,只能通过转发才可访问,重定向是不能访问的

注意:重定向不限于Servlet之间,Servlet也可以重定向到HTML和JSP页面

用户登录:

03_login.html

<!DOCTYPE
HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>03_login.html</title>
    <meta
http-equiv="keywords"
content="keyword1,keyword2,keyword3">
    <meta
http-equiv="description"
content="this is my page">
    <meta
http-equiv="content-type"
content="text/html; charset=UTF-8">
  </head>
  <body>
    <form
action="/day12/Demo06"
method="POST">
           <table
border="2"
align="center">
                <tbody>
                     <tr>
                          <td>用户名</td>
                          <td><input
type="text"
name="username"
value="哈哈"
maxlength="4"/></td>
                     </tr>
                     <tr>
                          <td>密码</td>
                          <td><input
type="password"
name="password"
value="123456"
maxlength="6"/></td>
                     </tr>
                     <tr>
                          <td
colspan="2"
align="center">
                                <input
type="submit"
value="提交"
style="width:111px"/>
                          </td>
                     </tr>
           </table>
     </form>
  </body>
</html>
 

Demo06.java

public
class
Demo06 extends HttpServlet {
     public
void
doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
           request.setCharacterEncoding("UTF-8");
           String username = request.getParameter("username");
           String password = request.getParameter("password");
           if("赵君".equals(username) &&
"123456".equals(password)){
                response.sendRedirect(request.getContextPath()+"/04_welcome.html");
           }else{
                response.sendRedirect(request.getContextPath()+"/05_error.html");
           }
     }
}

05_error.html

<!DOCTYPE
HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>05_error.html</title>
    <meta
http-equiv="keywords"
content="keyword1,keyword2,keyword3">
    <meta
http-equiv="description"
content="this is my page">
    <meta
http-equiv="content-type"
content="text/html; charset=UTF-8">
    <!--
    <meta http-equiv="refresh" content="5;url=03_login.html">
     -->
  </head>
  <body>
     <font
style="font-size:66;color:green;">出错了,<span
id="timeID">5</span>秒后,回到登录页面</font>
    
     <script
type="text/javascript">
           function
updateTime(){
                var
span = document.getElementById("timeID");
                var
strTime = span.innerHTML;
                var
time = parseInt(strTime);
                if(time>1){
                     time--;
                     span.innerHTML = time;
                }else{
                     var
url = "http://127.0.0.1:8080/day12/03_login.html";
                     window.location.href = url;
                }
           }
           window.setInterval("updateTime()",1000);
     </script>
  </body>
</html>

03_welcome.html

<!DOCTYPE
HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>03_welcome.html</title>
    <meta
http-equiv="keywords"
content="keyword1,keyword2,keyword3">
    <meta
http-equiv="description"
content="this is my page">
    <meta
http-equiv="content-type"
content="text/html; charset=UTF-8">
  </head>
  <body>
     <font
style="font-size:66;color:green;">欢迎光临</font>
  </body>
</html>

 

 

 

 

 

附加:总结一下”/”表示什么

01——<a href=”/”>:表示webapps目录

02——<imgsrc=”/”>:表示webapps目录

03——<formaction=”/”>:表示webapps目录

04——request.getRequestDispatcher(“/”).forward():表示当前WEB应用的名,即day12

05——response.sendRedirect(“/”):表示webapps目录

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息