javaWeb核心技术二

来源:互联网 发布:云计算发展与政策论坛 编辑:程序博客网 时间:2024/06/14 16:49

第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();//方法返回客户机请求方式 GETPOST

           //如:/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

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>注册表单</title>

</head>

<body>

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

    <formaction="/day12/Demo02"method="POST">

        <tableborder="2"align="center">

             <tbody>

                 <tr>

                     <td>用户名</td>

                     <td><inputtype="text"name="username"value="哈哈"/></td>

                 </tr>

                 <tr>

                     <td>密码</td>

                     <td><inputtype="password"name="password"value="123456"/></td>

                 </tr>

                 <tr>

                     <td>性别</td>

                     <td>

                         <inputtype="radio"name="gender"value=""checked="checked"/>

                         <inputtype="radio"name="gender"value=""/>

                     </td>

                 </tr>

                 <tr>

                     <td>爱好</td>

                     <td>

                         <inputtype="checkbox"name="like"value="打球"/>打球

                         <inputtype="checkbox"name="like"value="看电视"/>看电视

                         <inputtype="checkbox"name="like"value="上网"/>上网

                         <inputtype="checkbox"name="like"value="收藏"checked="checked"/>收藏

                     </td>

                 </tr>

                 <tr>

                     <td>选择上传的文件</td>

                     <td>

                         <inputtype="file"name="upload"/>

                     </td>

                 </tr>

                

                 <tr>

                     <td>选择你想就业的城市</td>

                     <td>

                         <selectname="city">

                             <optionvalue="北京">北京</option>

                             <optionvalue="上海">上海</option>

                             <optionvalue="深圳">深圳</option>

                             <optionvalue="广州"selected="selected">广州</option>

                             <optionvalue="杭州">杭州</option>

                         </select>

                     </td>

                 </tr>

                 <tr>

                     <td><inputtype="submit"value="提交按钮"/></td>

                     <td><inputtype="reset"value="重填按钮"/></td>

                 </tr>

             </tbody>

        </table>

    </form>

</body>

</html>

 Demo02.java

 public class Demo02 extends HttpServlet {

     protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {

           this.doPost(request,response);

     }

     protected void doPost(HttpServletRequest request, HttpServletResponseresponse) 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, HttpServletResponseresponse) throws ServletException, IOException {

           //this.useByte(request,response);

           this.useChar(request,response);

     }

     /**

      * 以字符方式输出中,英,数,

      */

     private void useChar(HttpServletRequest request, HttpServletResponseresponse) 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, HttpServletResponseresponse) 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

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>03_login.html</title>

    <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

    <metahttp-equiv="description"content="this is my page">

    <metahttp-equiv="content-type"content="text/html; charset=UTF-8">

  </head>

  <body>

    <formaction="/day12/Demo06"method="POST">

           <tableborder="2"align="center">

                <tbody>

                     <tr>

                          <td>用户名</td>

                          <td><inputtype="text"name="username"value="哈哈"maxlength="4"/></td>

                     </tr>

                     <tr>

                          <td>密码</td>

                          <td><inputtype="password"name="password"value="123456"maxlength="6"/></td>

                     </tr>

                     <tr>

                          <tdcolspan="2"align="center">

                                <inputtype="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

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>05_error.html</title>

    <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

    <metahttp-equiv="description"content="this is my page">

    <metahttp-equiv="content-type"content="text/html; charset=UTF-8">

    <!--

    <meta http-equiv="refresh" content="5;url=03_login.html">

     -->

  </head>

  <body>

     <fontstyle="font-size:66;color:green;">出错了,<spanid="timeID">5</span>秒后,回到登录页面</font>

    

     <scripttype="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{

                     varurl = "http://127.0.0.1:8080/day12/03_login.html";

                     window.location.href = url;

                }

           }

           window.setInterval("updateTime()",1000);

     </script>

  </body>

</html>

03_welcome.html

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>03_welcome.html</title>

    <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

    <metahttp-equiv="description"content="this is my page">

    <metahttp-equiv="content-type"content="text/html; charset=UTF-8">

  </head>

  <body>

     <fontstyle="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();//方法返回客户机请求方式 GETPOST

           //如:/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

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>注册表单</title>

</head>

<body>

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

    <formaction="/day12/Demo02"method="POST">

        <tableborder="2"align="center">

             <tbody>

                 <tr>

                     <td>用户名</td>

                     <td><inputtype="text"name="username"value="哈哈"/></td>

                 </tr>

                 <tr>

                     <td>密码</td>

                     <td><inputtype="password"name="password"value="123456"/></td>

                 </tr>

                 <tr>

                     <td>性别</td>

                     <td>

                         <inputtype="radio"name="gender"value=""checked="checked"/>

                         <inputtype="radio"name="gender"value=""/>

                     </td>

                 </tr>

                 <tr>

                     <td>爱好</td>

                     <td>

                         <inputtype="checkbox"name="like"value="打球"/>打球

                         <inputtype="checkbox"name="like"value="看电视"/>看电视

                         <inputtype="checkbox"name="like"value="上网"/>上网

                         <inputtype="checkbox"name="like"value="收藏"checked="checked"/>收藏

                     </td>

                 </tr>

                 <tr>

                     <td>选择上传的文件</td>

                     <td>

                         <inputtype="file"name="upload"/>

                     </td>

                 </tr>

                

                 <tr>

                     <td>选择你想就业的城市</td>

                     <td>

                         <selectname="city">

                             <optionvalue="北京">北京</option>

                             <optionvalue="上海">上海</option>

                             <optionvalue="深圳">深圳</option>

                             <optionvalue="广州"selected="selected">广州</option>

                             <optionvalue="杭州">杭州</option>

                         </select>

                     </td>

                 </tr>

                 <tr>

                     <td><inputtype="submit"value="提交按钮"/></td>

                     <td><inputtype="reset"value="重填按钮"/></td>

                 </tr>

             </tbody>

        </table>

    </form>

</body>

</html>

 Demo02.java

 public class Demo02 extends HttpServlet {

     protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {

           this.doPost(request,response);

     }

     protected void doPost(HttpServletRequest request, HttpServletResponseresponse) 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, HttpServletResponseresponse) throws ServletException, IOException {

           //this.useByte(request,response);

           this.useChar(request,response);

     }

     /**

      * 以字符方式输出中,英,数,

      */

     private void useChar(HttpServletRequest request, HttpServletResponseresponse) 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, HttpServletResponseresponse) 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

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>03_login.html</title>

    <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

    <metahttp-equiv="description"content="this is my page">

    <metahttp-equiv="content-type"content="text/html; charset=UTF-8">

  </head>

  <body>

    <formaction="/day12/Demo06"method="POST">

           <tableborder="2"align="center">

                <tbody>

                     <tr>

                          <td>用户名</td>

                          <td><inputtype="text"name="username"value="哈哈"maxlength="4"/></td>

                     </tr>

                     <tr>

                          <td>密码</td>

                          <td><inputtype="password"name="password"value="123456"maxlength="6"/></td>

                     </tr>

                     <tr>

                          <tdcolspan="2"align="center">

                                <inputtype="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

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>05_error.html</title>

    <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

    <metahttp-equiv="description"content="this is my page">

    <metahttp-equiv="content-type"content="text/html; charset=UTF-8">

    <!--

    <meta http-equiv="refresh" content="5;url=03_login.html">

     -->

  </head>

  <body>

     <fontstyle="font-size:66;color:green;">出错了,<spanid="timeID">5</span>秒后,回到登录页面</font>

    

     <scripttype="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{

                     varurl = "http://127.0.0.1:8080/day12/03_login.html";

                     window.location.href = url;

                }

           }

           window.setInterval("updateTime()",1000);

     </script>

  </body>

</html>

03_welcome.html

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>03_welcome.html</title>

    <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

    <metahttp-equiv="description"content="this is my page">

    <metahttp-equiv="content-type"content="text/html; charset=UTF-8">

  </head>

  <body>

     <fontstyle="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目录

 

 

 

 

 

 

0 0
原创粉丝点击