Servlet

打印 上一主题 下一主题

主题 892|帖子 892|积分 2676

Servlet 本身不能独立运行,需要在一个web应用中运行的
而一个web应用是摆设在服务器中的,比如服务器tomcat。
1.获取参数

创建一个LoginServlet
因为浏览器中的form的method是post,所以LoginServlet需要提供一个doPost方法
在doPost方法中,通过request.getParameter 根据name取出对应的账号和密码
然后用System.out.println() 打印在控制台
本测试例子只是控制台输出,后面例子网页显示。
后台代码:LoginServlet  继承  HttpServlet

  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class LoginServlet extends HttpServlet {
  7.     protected void doPost(HttpServletRequest request, HttpServletResponse response)
  8.             throws ServletException, IOException {
  9.         String name = request.getParameter("name");
  10.         String password = request.getParameter("password");
  11.         System.out.println("name:" + name);
  12.         System.out.println("password:" + password);
  13.     }
  14. }
复制代码
后台配置文件: web.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app>
  3.        
  4.         <servlet>  # 定义了一个名为 LoginServlet 的 Servle
  5.                 <servlet-name>LoginServlet</servlet-name>
  6.                 <servlet-class>LoginServlet</servlet-class>
  7.         </servlet>
  8.         <servlet-mapping>
  9. #  Servlet 与 URL /login 进行绑定。用户访问 http://xx/login 时,LoginServlet 会处理该请求
  10.                 <servlet-name>LoginServlet</servlet-name>
  11.                 <url-pattern>/login</url-pattern>
  12.         </servlet-mapping>       
  13. </web-app>
复制代码
前台文件login.html
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>登录页面</title>
  6. </head>
  7. <body>
  8. <form action="login" method="post">
  9. 账号: <input type="text" name="name"> <br>
  10. 密码: <input type="password" name="password"> <br>
  11. <input type="submit" value="登录">
  12. </form>
  13. </body>
  14. </html>
复制代码
启动项目后,访问页面http://127.0.0.1/login.html 控制台会输出 账户、密码.
留意:前台action=login ,后台web配置中 <url-pattern>/login</url-pattern>  ,再到对应的LoginServlet
2.返回相应

本次将数据返回给前台页面展示
要求:
判断账号、密码是否为 admin 、123,如果是就打印successful 否则就打印 fail
根据账号密码,创建对应的html字符串。
然后通过response.getWriter().println() 发送到浏览器。

留意:显示successful 不是中文,下个例子防止浏览器因中文显示乱码。
  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. public class LoginServlet extends HttpServlet {
  8.     protected void doPost(HttpServletRequest request, HttpServletResponse response)
  9.             throws ServletException, IOException {
  10.         String name = request.getParameter("name");
  11.         String password = request.getParameter("password");
  12.         String html = null;
  13.         if ("admin".equals(name) && "123".equals(password))
  14.             html = "<div style='color:green'> Login Successful</div>";
  15.         else
  16.             html = "<div style='color:red'>Login Fail</div>";
  17.         PrintWriter pw = response.getWriter();
  18.         pw.println(html);
  19. // 或者显示==========
  20.     out.println("<html><body>");
  21.         out.println("<h1>Login Successful</h1>");
  22.         out.println("</body></html>");
  23. // ===========================
  24.     }
  25. }
复制代码
3.中文问题

   为了成功获取中文参数,需要做如下操作
1. login.html中加上
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
这句话的目的是告诉浏览器,等下发消息给服务器的时候,使用UTF-8编码

2. login.html
form的method修改为post

3. 在servlet进行解码和编码
  byte[] bytes= name.getBytes("ISO-8859-1");
  name = new String(bytes,"UTF-8");
  
先根据ISO-8859-1解码,然后用UTF-8编码
如许就可以得到正确的中文参数了

如许需要对每一个提交的数据都进行编码息争码处理惩罚,如果觉得麻烦,也可以使用一句话代替:
  request.setCharacterEncoding("UTF-8");
并且把这句话放在request.getParameter()之前
 
  通俗讲:字符串  小明  ,浏览器将其按规则A编码,后台获取后 也要按照规则A解码。
  即编码、解码 规则一致就不会乱码【一样平常针对的是中文】。
  login.html
  1. <!DOCTYPE html>
  2. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  3. <form action="login" method="post">
  4.         账号 : <input type="text" name="name"> <br> 密码: <input
  5.                 type="password" name="password"> <br> <input
  6.                 type="submit" value="登录">
  7. </form>
复制代码
LoginServlet.java
  1. public class LoginServlet extends HttpServlet {
  2.     protected void doPost(HttpServletRequest request, HttpServletResponse response)
  3.             throws ServletException, IOException {
  4. // 该方法中统一设置解码
  5.         request.setCharacterEncoding("UTF-8");
  6.         String name = request.getParameter("name");
  7.         // byte[] bytes = name.getBytes("ISO-8859-1");
  8.         // name = new String(bytes, "UTF-8");
  9. // 浏览器和网页编码的发展经历了几个阶段,ISO-8859-1、GBK 和 UTF-8 是其中非常关键的几个编码方式,它们代表了不同的历史阶段和全球化需求
  10.         String password = request.getParameter("password");
  11.         System.out.println("name:" + name);
  12. // 返回中文的响应 ,也要设置
  13.         response.setContentType("text/html; charset=UTF-8");
  14.         PrintWriter pw = response.getWriter();
  15.         pw.println("登陆成功!");
  16.     }
  17. }
复制代码
response.setContentType("text/html; charset=UTF-8"); 
作用是设置 HTTP 相应的内容类型和字符编码。【告诉客户端(如浏览器)相应内容的类型以及它的字符编码】


  • text/html:这是相应的 MIME 类型,表现相应内容是 HTML 文档。这意味着服务器将发送一个 HTML 页面,浏览器会将其渲染为网页。
  • charset=UTF-8:这部分指定了相应内容的字符编码为 UTF-8。UTF-8 是一种常见的字符编码,支持天下上几乎所有语言的字符。通过设置为 UTF-8,可以确保浏览器正确地解码和显示网页中的多语言内容,尤其是对于中文或其他非 ASCII 字符集的支持。
4.调用流程



还原一下颠末:
1.客户发送http://127.0.0.1/login.html,打开静态页面,里面填写账户、密码 ,以POST方式提交到 /login 路径。
2.tomcat吸收请求,http://127.0.0.1/login 与web配置文件匹配,找到对应的类LoginServlet。
3.tomcat发现没有LoginServlet存在,就调用无参构造方法实例化一个LoginServlet对象
4.tomcat拿到LoginServlet实例之后,根据方法类型 POST找到对应的doPost方法
5.通过request 获取参数,response 设置相应。
       protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
// 该方法中同一设置解码
        request.setCharacterEncoding("UTF-8");
  // 获取 姓名  密码
        String name = request.getParameter("name");
        String password = request.getParameter("password");
 
        System.out.println("name:" + name);
 
        PrintWriter pw = response.getWriter();
// 返回中文的相应 ,也要设置 
        response.setContentType("text/html; charset=UTF-8");
  String result ="登陆成功!";
        pw.println(result);
    }
  6. tomcat 将 相应内容传递给浏览器。
        在Servlet完成工作之后,tomcat拿到被Servlet修改过的response,根据这个response天生result字符串,然后再通过HTTP协议,把result字符串,复兴给浏览器,浏览器再根据HTTP协议获取这个result字符串,并渲染在界面上。
5.生命周期

一个 Servlet 的生命周期由 Web 容器管理,重要包括 加载\实例化初始化请求处理惩罚\提供服务 和 销毁 四个阶段。
1.实例化-加载         反射
        初次吸收到请求时,Web 容器会根据配置文件(如 web.xml)或注解(如 @WebServlet)加载 Servlet 类,此时Servlet会被实例化。【只实行一次!Servlet是单例的!】可以无参构造中打印一条语句检察验证。
2.初始化           init()方法
        LoginServlet 继承了HttpServlet,HttpServlet继承了GenericServlet。所以LoginServlet也继承了init(ServletConfig) 方法。
init 方法是一个实例方法,所以会在构造方法实行后实行。无论访问了多少次LoginSerlvet
init初始化 只会实行一次

3.请求处理惩罚\提供服务         service()方法
        接下来就是实行service()方法,然后通过浏览器传递过来的信息进行判断,是调用doGet()还是doPost()方法来相应请求。
4.销毁        destroy()方法
        当容器关闭或卸载 Servlet 时,调用 destroy() 方法。该方法用于释放 Servlet 使用的资源,如关闭数据库连接、释放文件句柄等
1.Servlet所在的web应用重启
   <Context path="/" docBase="e:\\project\\j2ee\\web" debug="0" reloadable="false" />
  如果把 reloadable="false" 改为reloadable="true" 就表现有任何类发生的更新,web应用会主动重启
当web应用主动重启的时候,destroy()方法就会被调用。【重启前先卸载容器内的servlet】
  Web 应用主动重启通常发生在以下几种环境:
  

  • 修改了 Web 应用的代码或资源:例如,修改了 JSP 文件、Servlet 类、配置文件等。许多 Web 容器(如 Tomcat)会检测到这些变化,并重新加载 Web 应用,这可能会导致容器卸载旧的 Servlet 并加载新的 Servlet。
  • 容器重启:当 Web 容器本身重启时,所有的 Web 应用都会经历从初始化到销毁的生命周期。
  • 摆设新的版本:当你摆设一个新的 Web 应用或更新现有的 Web 应用时,容器通常会先销毁旧的应用,再加载新的版本。
  2.关闭tomcat的时候 destroy()方法会被调用,但是这个一样平常都发生的很快,不易被发现
6.跳转

页面跳转是开辟一个web应用常常会发生的事变。比如登录成功或是失败后,分别会跳转到不同的页面。

跳转的方式有两种,服务端跳转和客户端跳转
   首先在web目录下准备两个页面 success.html,fail.html
分别用于显示登录成功 或者登录失败

如果登录成功了,服务端跳转到success.html

如果登录失败了,客户端跳转到fail.html
  
success.htmlfail.html
<div style="color:green">login success</div><div style="color:red">login fail</div>
request.getRequestDispatcher("success.html").forward(request, response);response.sendRedirect("fail.html");
服务端跳转可以看到浏览器的地址依然是/login 路径,并不会变成success.html  仍是xx/login
客户端跳转,浏览器地址发生了变化
原先地址xx/login变为了xx/fail.html
  1. public class LoginServlet extends HttpServlet {
  2.     private static final long serialVersionUID = 1L;
  3.     protected void service(HttpServletRequest request, HttpServletResponse response)
  4.             throws ServletException, IOException {
  5.         String name = request.getParameter("name");
  6.         String password = request.getParameter("password");
  7.         if ("admin".equals(name) && "123".equals(password)) {
  8. // 服务端跳转 也叫  转发 浏览器表面看不出来变化
  9.             request.getRequestDispatcher("success.html").forward(request, response);
  10.         } else{
  11. // 客户端跳转  也叫 重定向
  12.             response.sendRedirect("fail.html");
  13.         }
  14.     }
  15. }
复制代码

  7.自启动

有的时候会有如许的业务需求:
tomcat一启动,就需要实行一些初始化的代码,比如校验数据库的完备性等。
但是Servlet的生命周期是在用户访问浏览器对应的路径开始的。如果没有用户的第一次访问,就无法实行相关代码。怎么办?Servlet实现自启动
很简单:web.xml中添加     <load-on-startup>10</load-on-startup>
取值范围是1-99   数字越小,启动的优先级越高

即表明该Servlet会随着Tomcat的启动而初始化。

同时,为HelloServlet提供一个init(ServletConfig) 方法,验证自启动
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app>
  3.         <servlet>
  4.                 <servlet-name>LoginServlet</servlet-name>
  5.                 <servlet-class>LoginServlet</servlet-class>
  6.         <load-on-startup>10</load-on-startup>
  7.         </servlet>
  8.         <servlet-mapping>
  9.                 <servlet-name>LoginServlet</servlet-name>
  10.                 <url-pattern>/login</url-pattern>
  11.         </servlet-mapping>       
  12. </web-app>
复制代码
  1. public class HelloServlet extends HttpServlet{
  2.      
  3.     public void init(ServletConfig config){
  4.         System.out.println("init of Hello Servlet");
  5.     }
  6.     public void doGet(HttpServletRequest request, HttpServletResponse response){
  7.          
  8.         try {
  9.             response.getWriter().println("<h1>Hello Servlet!</h1>");
  10.             response.getWriter().println(new Date().toLocaleString());
  11.         } catch (IOException e) {
  12.             // TODO Auto-generated catch block
  13.             e.printStackTrace();
  14.         }
  15.     }
  16.      
  17. }
复制代码
8.request常见方法

   request.getRequestURL(): 浏览器发出请求时的完备URL,包括协议 主机名 端口(如果有)"
request.getRequestURI(): 浏览器发出请求的资源名部分,去掉了协媾和主机名"
request.getQueryString(): 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
request.getRemoteAddr(): 浏览器所处于的客户机的IP地址
request.getRemoteHost(): 浏览器所处于的客户机的主机名
request.getRemotePort(): 浏览器所处于的客户机使用的网络端口
request.getLocalAddr(): 服务器的IP地址
request.getLocalName(): 服务器的主机名
request.getMethod(): 得到客户机请求方式一样平常是GET或者POST
  1. <!DOCTYPE html>
  2. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  3. <form action="register" method="get">
  4.         账号 : <input type="text" name="name"> <br>
  5.         爱好 : LOL<input type="checkbox" name="hobits" value="lol">
  6.                 DOTA<input type="checkbox" name="hobits" value="dota"> <br>
  7.           
  8.                  <input type="submit" value="注册">
  9. </form>
复制代码

  获取参数
request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 "hobits",可以是多选的。

request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。
前台
  1. <!DOCTYPE html>
  2. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  3. <form action="register" method="get">
  4.         账号 : <input type="text" name="name"> <br>
  5.         爱好 : LOL<input type="checkbox" name="hobits" value="lol">
  6.                 DOTA<input type="checkbox" name="hobits" value="dota"> <br>
  7.           
  8.                  <input type="submit" value="注册">
  9. </form>
复制代码
后台
  1. public class RegisterServlet extends HttpServlet {
  2.     protected void service(HttpServletRequest request, HttpServletResponse response)
  3.             throws ServletException, IOException {
  4.         System.out.println("获取单值参数name:" + request.getParameter("name"));
  5. // 前台type=checkbox 可多选,后台得到数组
  6.         String[] hobits = request.getParameterValues("hobits");
  7.         System.out.println("获取具有多值的参数hobits: " + Arrays.asList(hobits));
  8.         System.out.println("通过 getParameterMap 遍历所有的参数: ");
  9.         Map<String, String[]> parameters = request.getParameterMap();
  10.         Set<String> paramNames = parameters.keySet();
  11.         for (String param : paramNames) {
  12.             String[] value = parameters.get(param);
  13.             System.out.println(param + ":" + Arrays.asList(value));
  14.         }
  15.     }
  16. }
复制代码
web.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app>
  3.         <servlet>
  4.                 <servlet-name>LoginServlet</servlet-name>
  5.                 <servlet-class>LoginServlet</servlet-class>
  6.         <load-on-startup>10</load-on-startup>
  7.         </servlet>
  8.         <servlet-mapping>
  9.                 <servlet-name>LoginServlet</servlet-name>
  10.                 <url-pattern>/login</url-pattern>
  11.         </servlet-mapping>       
  12.         <servlet>
  13.                 <servlet-name>RegisterServlet</servlet-name>
  14.                 <servlet-class>RegisterServlet</servlet-class>
  15.         </servlet>
  16.         <servlet-mapping>
  17.                 <servlet-name>RegisterServlet</servlet-name>
  18.                 <url-pattern>/register</url-pattern>
  19.         </servlet-mapping>       
  20. </web-app>
复制代码
9.获取头信息

           request.getHeader() 获取浏览器传递过来的头信息。
  比如getHeader("user-agent") 可以获取浏览器的根本资料,如许就能判断是firefox、IE、chrome、或者是safari浏览器
        request.getHeaderNames() 获取浏览器所有的头信息名称,根据头信息名称就能遍历出所有的头信息

host: 主机地址
user-agent: 浏览器根本资料
accept: 表现浏览器接受的数据类型
accept-language: 表现浏览器接受的语言
accept-encoding: 表现浏览器接受的压缩方式,是压缩方式,并非编码
connection: 是否保持连接
cache-control: 缓存时限
  
 
  1. import java.io.IOException;
  2. import java.util.Date;
  3. import java.util.Enumeration;
  4. import javax.servlet.ServletConfig;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class HelloServlet extends HttpServlet{
  9.        
  10.         public void init(ServletConfig config){
  11.                 System.out.println("init of Hello Servlet");
  12.         }
  13.         public void doGet(HttpServletRequest request, HttpServletResponse response){
  14.        
  15.                 Enumeration<String> headerNames= request.getHeaderNames();
  16.                 while(headerNames.hasMoreElements()){
  17.                         String header = headerNames.nextElement();
  18.                         String value = request.getHeader(header);
  19.                         System.out.printf("%s\t%s%n",header,value);
  20.                 }
  21.                
  22.                 try {
  23.                         response.getWriter().println("<h1>Hello Servlet!</h1>");
  24.                         response.getWriter().println(new Date().toLocaleString());
  25.                 } catch (IOException e) {
  26.                         // TODO Auto-generated catch block
  27.                         e.printStackTrace();
  28.                 }
  29.         }
  30.        
  31. }
复制代码

  10.服务端传参

setAttribute和getAttribute可以用来在进行服务端跳转的时候,在不同的Servlet之间进行数据共享。
在 Servlet 中,可以通过多种方式将数据传递给客户端或在不同的请求间共享数据:


  • 请求参数(URL 参数、表单提交)可以通过 HttpServletRequest 获取。
  • 会话数据可以通过 HttpSession 进行传递。
  • 全局数据可以通过 ServletContext 共享。
  • 请求转发可以通过 RequestDispatcher 来传递数据并转发请求。
  1. 1. 通过 URL 参数传递数据 (GET 请求)
  2. 当客户端发送一个 GET 请求时,服务端可以通过 URL 参数传递数据。这些参数会附加在 URL 后面。
  3. 客户端请求:
  4. <a href="myServlet?name=John&age=30">Click me</a>
  5. 服务端接收:
  6. @WebServlet("/myServlet")  省去配置web.xml  
  7. public class MyServlet extends HttpServlet {
  8.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  9.         String name = request.getParameter("name");  // 获取 "name" 参数
  10.         String age = request.getParameter("age");    // 获取 "age" 参数
  11.         response.getWriter().write("Name: " + name + ", Age: " + age);
  12.     }
  13. }
  14. 2. 通过表单提交数据 (POST 请求)
  15. 客户端也可以通过 HTML 表单提交数据到服务端。表单数据通常通过 POST 请求发送到指定的 URL。
  16. 客户端 HTML 表单:
  17. <form action="myServlet" method="post">
  18.     <input type="text" name="username" />
  19.     <input type="password" name="password" />
  20.     <input type="submit" value="Submit" />
  21. </form>
  22. 服务端接收:
  23. @WebServlet("/myServlet")
  24. public class MyServlet extends HttpServlet {
  25.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  26.         String username = request.getParameter("username");
  27.         String password = request.getParameter("password");
  28.         response.getWriter().write("Username: " + username + ", Password: " + password);
  29.     }
  30. }
  31. 3. 通过 HttpSession 传递数据
  32. HttpSession 对象允许在多个请求之间存储数据,从而实现跨请求的数据传递。它通常用于在一个用户会话中保存数据。
  33. 设置 Session 数据:
  34. @WebServlet("/setSession")
  35. public class SetSessionServlet extends HttpServlet {
  36.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  37.         HttpSession session = request.getSession();
  38.         session.setAttribute("username", "John");  // 保存数据到 Session
  39.         response.getWriter().write("Session data set.");
  40.     }
  41. }
  42. 获取 Session 数据:
  43. @WebServlet("/getSession")
  44. public class GetSessionServlet extends HttpServlet {
  45.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  46.         HttpSession session = request.getSession();
  47.         String username = (String) session.getAttribute("username");  // 获取 Session 数据
  48.         response.getWriter().write("Session data: " + username);
  49.     }
  50. }
  51. 4. 通过 ServletContext 传递数据
  52. ServletContext 是一个全局对象,它可以在同一 Web 应用中的所有 Servlet 和 JSP 页面之间共享数据。不同的 Servlet 可以通过 ServletContext 存取全局范围的数据。
  53. 设置 ServletContext 数据:
  54. @WebServlet("/setContext")
  55. public class SetContextServlet extends HttpServlet {
  56.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  57.         ServletContext context = getServletContext();
  58.         context.setAttribute("company", "TechCorp");  // 保存数据到 ServletContext
  59.         response.getWriter().write("ServletContext data set.");
  60.     }
  61. }
  62. 获取 ServletContext 数据:
  63. @WebServlet("/getContext")
  64. public class GetContextServlet extends HttpServlet {
  65.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  66.         ServletContext context = getServletContext();
  67.         String company = (String) context.getAttribute("company");  // 获取 ServletContext 数据
  68.         response.getWriter().write("ServletContext data: " + company);
  69.     }
  70. }
  71. 5. 通过 RequestDispatcher 转发请求并传递数据
  72. RequestDispatcher 用于请求转发,服务端可以通过 RequestDispatcher 将请求转发给另一个 Servlet,并传递请求数据。
  73. 请求转发并传递数据:
  74. @WebServlet("/forwardRequest")
  75. public class ForwardRequestServlet extends HttpServlet {
  76.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  77.         request.setAttribute("message", "Hello from the first servlet!");
  78.         RequestDispatcher dispatcher = request.getRequestDispatcher("/receiveRequest");
  79.         dispatcher.forward(request, response);
  80.     }
  81. }
  82. 接收转发的请求:
  83. @WebServlet("/receiveRequest")
  84. public class ReceiveRequestServlet extends HttpServlet {
  85.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  86.         String message = (String) request.getAttribute("message");
  87.         response.getWriter().write("Received message: " + message);
  88.     }
  89. }
复制代码
11.response 用法

        response是HttpServletResponse的实例,用于提供给浏览器的相应信息
1.设置相应内容
   PrintWriter pw= response.getWriter();
通过response.getWriter(); 获取一个PrintWriter 对象
可以使用println(),append(),write(),format()等等方法设置返回给浏览器的html内容。
  pw.println("<h1>Hello Servlet</h1>");
  2.设置相应格式
   response.setContentType("text/html");
  "text/html" 是即格式 ,在request获取头信息 request获取头信息 中对应的request.getHeader("accept").
"text/html" 是存在的,表现浏览器可以辨认这种格式,如果换一个其他的格式, 比如 "text/lol" ,浏览器不能辨认,那么打开此servlet就会弹出一个下载的对话框。
  3.设置相应编码
   设置相应编码有两种方式
  1. response.setContentType("text/html; charset=UTF-8");
          设置字符编码,还设置了相应内容的类型浏览器在吸收到该相应时,会根据 Content-Type 来判断该如那边理数据。
  2. response.setCharacterEncoding("UTF-8");  只设置字符编码,不指定内容类型
  这两种方式都需要在response.getWriter调用之前实行才华见效。
最佳实践:通常环境下,为了确保相应体在不同浏览器中都能正确显示,建议同时设置这两者。
  4.设置不使用缓存
   使用缓存可以加快页面的加载,降低服务端的负担。但是也可能看到过时的信息,可以通过如动手段关照浏览器不要使用缓存
    response.setDateHeader("Expires", 0); // [告诉浏览器相应内容已过期。]
    response.setHeader("Cache-Control", "no-cache");//[确保每次请求都验证缓存的有用性]
    response.setHeader("pragma", "no-cache");// [Pragma 头是 HTTP/1.0 中用于禁用缓存的头,它在较新的 HTTP/1.1 中被 Cache-Control 头代替,但为了兼容旧版浏览器,通常仍会一起使用。]
    response.getWriter().println("<h1>Hello Servlet!</h1>");
    response.getWriter().println(new Date().toLocaleString());
  12.上传文件

前台:
  1. <!DOCTYPE html>
  2. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  3. <form action="uploadFile" method="post" enctype="multipart/form-data">
  4.   名称:<input type="text" name="name" /> <br>
  5.   上传 : <input type="file" name="filepath" /> <br>
  6.   <input type="submit" value="上传">
  7. </form>
复制代码
留意:
1. form 的method必须是post的,get不能上传文件。 还需要加上enctype="multipart/form-data" 表现提交的数据是二进制文件
后台:
         需要用到两个第三方的jar包,commons-io-1.4.jar和commons-fileupload-1.2.2.jar。 在右侧下载,并放在WEB-INF/lib下
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.InputStream;
  5. import java.io.PrintWriter;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import org.apache.commons.fileupload.FileItem;
  13. import org.apache.commons.fileupload.FileUploadException;
  14. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
  15. import org.apache.commons.fileupload.servlet.ServletFileUpload;
  16. public class UploadPhotoServlet extends HttpServlet {
  17.     public void doPost(HttpServletRequest request, HttpServletResponse response) {
  18.         String filename = null;
  19.         try {
  20. //使用 DiskFileItemFactory 和 ServletFileUpload 来解析上传的请求:
  21.             DiskFileItemFactory factory = new DiskFileItemFactory();
  22.             ServletFileUpload upload = new ServletFileUpload(factory);
  23.             // 设置上传文件的大小限制为1M
  24.             factory.setSizeThreshold(1024 * 1024);
  25.             
  26.             List items = null;
  27.             try {
  28. // 解析请求,得到所有表单项
  29.                 items = upload.parseRequest(request);
  30.             } catch (FileUploadException e) {
  31.                 e.printStackTrace();
  32.             }
  33.             Iterator iter = items.iterator();
  34.             while (iter.hasNext()) {
  35. //每个 FileItem 对象代表请求中的一个字段(可能是文件或表单数据)。
  36.                 FileItem item = (FileItem) iter.next();
  37.                 if (!item.isFormField()) {// 如果不是表单字段(即文件上传字段)
  38.                     // 根据时间戳创建头像文件
  39.                     filename = System.currentTimeMillis() + ".jpg";
  40.                     
  41.                     //通过getRealPath获取上传文件夹,如果项目在e:/project/j2ee/web,那么就会自动获取到 e:/project/j2ee/web/uploaded
  42.                     String photoFolder =request.getServletContext().getRealPath("uploaded"); // 获取上传目录路径
  43.                     
  44.                     File f = new File(photoFolder, filename);
  45.                     f.getParentFile().mkdirs();
  46.                     // 通过item.getInputStream()获取浏览器上传的文件的输入流
  47.                     InputStream is = item.getInputStream();
  48.                     // 复制文件
  49.                     FileOutputStream fos = new FileOutputStream(f);
  50.                     byte b[] = new byte[1024 * 1024];
  51.                     int length = 0;
  52.                     while (-1 != (length = is.read(b))) {
  53.                         fos.write(b, 0, length);
  54.                     }
  55.                     fos.close();
  56.                 } else {
  57.                         System.out.println(item.getFieldName());
  58.                     String value = item.getString();
  59.                     value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
  60.                     System.out.println(value);
  61.                 }
  62.             }
  63.             
  64.             String html = "<img width='200' height='150' src='uploaded/%s' />";
  65.             response.setContentType("text/html");
  66.             PrintWriter pw= response.getWriter();
  67.             
  68.             pw.format(html, filename);
  69.             
  70.         } catch (FileNotFoundException e) {
  71.             // TODO Auto-generated catch block
  72.             e.printStackTrace();
  73.         } catch (Exception e) {
  74.             // TODO Auto-generated catch block
  75.             e.printStackTrace();
  76.         }
  77.     }
  78. }
复制代码
web.xml
  1.         <servlet>
  2.                 <servlet-name>UploadFileServlet</servlet-name>
  3.                 <servlet-class>UploadPhotoServlet</servlet-class>
  4.         </servlet>
  5.         <servlet-mapping>
  6.                 <servlet-name>UploadFileServlet</servlet-name>
  7.                 <url-pattern>/uploadFile</url-pattern>
  8.         </servlet-mapping>       
复制代码
上传测试:
重启tomcat, 打开页面进行上传       http://127.0.0.1/upload.html
如那边理其他非File字段?
   因为浏览器指定了以二进制的情势提交数据,那么就不能通过常规的手段获取非File字段:
  request.getParameter("name")
  

  在遍历Item时(Item即对应浏览器提交的字段),可以通过
item.isFormField  true 是常规表单字段。
  通过item.getFieldName()和item.getString()就知道分别是哪个字段,以及字段的值了。
  13.Servlet无法配置Tomcat

重要针对Eclipse,idea自带内置服务器方便调试。
办理办法:定位到你自身安转的  盘:\project\.metadata\.plugins\org.eclipse.core.runtime\.settings
删除:
org.eclipse.wst.server.core.prefs
org.eclipse.jst.server.tomcat.core.prefs
删除后重启即可。
14.无法启动Tomcat

办理办法粗暴一点:菜单-Window->Show View->Other->Server->Servers 此时会出现如图所示的Tomcat v7.0 Server....
右键点击,选择Delete
然后再重新配置 通过Eclipse启动Tomcat-Run On Server 即可~
留意:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表