java学习基础-4

servlet

Java Servlet 是 运 行 在 W e b 服 务 器 \color{red}运行在 Web 服务器 Web或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间 中 间 层 \color{red}{中间层}

servlet的优势

1.性能好。
2.Servlet 在 Web 服务器的地址空间内执行,这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
3.Servlet 是独立于平台的,因为它们是用 Java 编写的。
4.服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
5.Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。

servlet 架构

servlet

servlet如何使用

Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类

public class ServletDemo extends HttpServlet {
    
    

  @Override
  public void init(ServletConfig config) throws ServletException {
    
    
    super.init(config);
    System.out.println("servlet initing...");
  }

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException, ServletException, IOException {
    
    
      
    resp.setCharacterEncoding("UTF-8");
 	String user = req.getParameter("name");
    String pass = req.getParameter("pass");
    // 返回多选的值 [beijing, shanghai]
    String[] citys = req.getParameterValues("city");
	// 所有参数名的集合 	
    Enumeration<String> p = req.getParameterNames();
    //获取PrintWriter对象,用于向客户端发送文本
    PrintWriter outs = resp.getWriter();
    resp.addHeader("huahua", "yes");
    outs.println("hello user=" + user + "&pass=" + pass);
    outs.close();
  }
}

2.配置

  // 1.配置到web.xml 
  <servlet>
    <servlet-name>userServlet</servlet-name>
    <servlet-class>jspClass.ServletDemo</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>userServlet</servlet-name>
    <url-pattern>/userServlet</url-pattern>
  </servlet-mapping>
  // 2. 使用注解 在servlet3之后可以这样,上边的就不用配置了 
  @WebServlet("/userServlet")`
servlet的工作

1.处理来自客户端的显示请求(表单数据)和隐示请求数据(cookies、媒体类型和浏览器能理解的压缩格式)
2.处理数据并生成结果,可能使用数据库
3.发送显示数据(文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel )和隐示数据(告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务)

生命周期

1.Servlet 通过调用 init 方法进行初始化。它在第一次创建 Servlet 时被调用,方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期

2.Servlet 调用 service 方法来处理客户端的请求。 Web 服务器调用 service方法来处理来自客户端的请求,并把格式化的响应写回给客户端,每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。service方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以不用对 service方法做任何动作,只需来自客户端的请求类型来重写 doGet() 或 doPost() 即可

3.Servlet 通过调用 destroy 方法终止,destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收

4.最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的,

cookie操作
List cookies = Arrays.asList(req.getCookies());

Cookie cookie = new Cookie("huahua", "yes");
cookie.setValue("yesyes");
cookie.setDomain("localhost");
// 一天内有效
cookie.setMaxAge(60*60*24);
resp.addCookie(cookie);
过滤器

1.过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息

2.过滤器在web.xml里声明,当 Web 容器启动,会为您在部署描述符中声明的每一个过滤器创建一个实例。web.xml 中的 filter-mapping 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序,一般把Filter配置在所有的Servlet之前

// 1 写好 filter的java文件
public class LogFilter implements Filter {
    
    

  @Override
  public void  init(FilterConfig config) throws ServletException {
    
    
    // 获取初始化参数
    String site = config.getInitParameter("Site");

    // 输出初始化参数
    System.out.println();
    System.out.println("LogFilter ---- ---- 网站名称: " + site);
    System.out.println();
  }

  @Override
  public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
    
    

    System.out.println();
    System.out.println("LogFilter ---- ----  站点网址:http://www.huahuadavids.com");
    System.out.println();
    // 把请求传回过滤链
    chain.doFilter(request,response);
  }

  @Override
  public void destroy( ){
    
    
    /* 在 Filter 实例被 Web 容器从服务移除之前调用 */
  }
}

// 2 在web.xml 里配置一个过滤器 
 <filter>
    //过滤器名字
    <filter-name>LogFilter</filter-name>
    //过滤器类
    <filter-class>jspClass.LogFilter</filter-class>
    //初始化的参数
    <init-param>
      <param-name>Site</param-name>
      <param-value>huahuadavids site</param-value>
    </init-param>
  </filter>

// 3 指定过滤器执行的路径
  <filter-mapping>
    <filter-name>LogFilter</filter-name>
    <url-pattern> /* </url-pattern>
  </filter-mapping>

监听器

就是一个实现特定接口的普通java类,这个程序专门用于监听另一个java对象的方法调用或属性改变,如 servlet的 ServletContext、HttpSessionServletRequest 3个接口,类实现这几个接口,并重写方法,来实现监听的效果。

错误处理
  // 写好一个servlet,然后在web.xml 配置如下错误信息 
  <!-- error-code 相关的错误页面 -->
  <error-page>
    <error-code>404</error-code>
    <location>/ErrorHandler</location>
  </error-page>
  <error-page>
    <error-code>403</error-code>
    <location>/ErrorHandler</location>
  </error-page>
  <!-- exception-type 相关的错误页面 -->
  <error-page>
    <exception-type>
      javax.servlet.ServletException
    </exception-type >
    <location>/ErrorHandler</location>
  </error-page>

  <error-page>
    <exception-type>java.io.IOException</exception-type >
    <location>/ErrorHandler</location>
  </error-page>
session回话

1.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力
2.而session机制采用的是一种在客户端与服务器之间保持状态的解决方案
3.cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie
4.关闭浏览器不会导致session被删除
5.session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,我们叫做session cookie
6.session cookie是不能跨窗口,每次打开一个新窗口,服务端都生成一个新的session cookie,我们可以把第一次的sessionid保存到cookie,就不用每次生成sessionid了

 protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
    
    
    // 如果不存在 session 会话,则创建一个 session 对象
    HttpSession session = req.getSession(true);

    // 获取 session 创建时间
    Date createTime = new Date(session.getCreationTime());
    // 获取该网页的最后一次访问时间
    Date lastAccessTime = new Date(session.getLastAccessedTime());

    //设置日期输出的格式
    SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    String title = "Servlet Session 实例 - 菜鸟教程";
    int visitCount = 0;
    String visitCountKey = "visitCount";
    String userIDKey = "userID";
    String userID = "huahua";
    if(session.getAttribute(visitCountKey) == null) {
    
    
      session.setAttribute(visitCountKey, visitCount);
    }

    // 检查网页上是否有新的访问者
    if (session.isNew()){
    
    
      session.setAttribute(userIDKey, userID);
      // session 有效期为1天
      session.setMaxInactiveInterval(60*60*24);
    } else {
    
    
      visitCount = (Integer)session.getAttribute(visitCountKey);
      visitCount = visitCount + 1;
      if(visitCount == 5){
    
    
        // 使 session 无效
        session.invalidate();
        return;
      }
      userID = (String)session.getAttribute(userIDKey);
    }
    session.setAttribute(visitCountKey,  visitCount);


    res.setContentType("text/html;charset=UTF-8");
    PrintWriter out = res.getWriter();

    out.println("session-id="+ session.getId() + "<br/>");
    out.println("user-id="+ userID + "<br/>");
    out.println(visitCount);
    out.println(df.format(createTime));
    out.println(df.format(lastAccessTime));

  }

 //  session配置过期时间 默认tomcat过期时间是30分钟,在web.xml里配置如下,单位是分钟
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>
上传文件
// 前端文件
<form action="UploadServlet" method="POST" enctype="multipart/form-data">
    <div>
        文件:<input type="file" name="uploadFile">
    </div>

    <input type="submit" value="提交"/>
</form>

// servlet配置 
@WebServlet("/UploadServlet")
public class UploadDemo extends HttpServlet {
    
    
  private static final long serialVersionUID = 1L;
  // 上传文件存储目录
  private static final String UPLOAD_DIRECTORY = "upload";
  // 上传配置
  private static final int MEMORY_THRESHOLD   = 1024 * 1024 * 3;
  private static final int MAX_FILE_SIZE      = 1024 * 1024 * 40;
  private static final int MAX_REQUEST_SIZE   = 1024 * 1024 * 50;
  
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
    // 检测是否为多媒体上传
    if (!ServletFileUpload.isMultipartContent(request)) {
    
    
      // 如果不是则停止
      PrintWriter writer = response.getWriter();
      writer.println("Error: 表单必须包含 enctype=multipart/form-data");
      writer.flush();
      return;
    }

    // 配置上传参数
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
    factory.setSizeThreshold(MEMORY_THRESHOLD);
    // 设置临时存储目录
    factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

    ServletFileUpload upload = new ServletFileUpload(factory);

    // 设置最大文件上传值
    upload.setFileSizeMax(MAX_FILE_SIZE);

    // 设置最大请求值 (包含文件和表单数据)
    upload.setSizeMax(MAX_REQUEST_SIZE);

    // 中文处理
    upload.setHeaderEncoding("UTF-8");

    // 构造临时路径来存储上传的文件 这个路径相对当前应用的目录
    String uploadPath = request.getServletContext().getRealPath("./") + File.separator + UPLOAD_DIRECTORY;

    // 如果目录不存在则创建
    File uploadDir = new File(uploadPath);
    if (!uploadDir.exists()) {
    
    
      uploadDir.mkdir();
    }

    try {
    
    
      // 解析请求的内容提取文件数据
      List<FileItem> formItems = upload.parseRequest(request);

      if (formItems != null) {
    
    
        for (FileItem item : formItems) {
    
    
          // 处理不在表单中的字段
          if (!item.isFormField()) {
    
    
            String fileName = new File(item.getName()).getName();
            String filePath = uploadPath + File.separator + fileName;
            File storeFile = new File(filePath);
            // 保存文件到硬盘
            item.write(storeFile);
            request.setAttribute("message", "文件上传成功!");
          }
        }
      }
    } catch (Exception ex) {
    
    
      request.setAttribute("message",
          "错误信息: " + ex.getMessage());
    }
    // 跳转到 message.jsp
    request.getServletContext().getRequestDispatcher("/message.jsp").forward(request, response);
  }
}

重定向

    
	// super.doGet(req, resp);
	// 父类HttpServlet的doGet或doPost等方法的默认实现是返回状态代码为405的HTTP错误
	// 表示对于指定资源的请求方法不被允许,所以不可以写
    // 设置响应内容类型
    resp.setContentType("text/html;charset=UTF-8");
    // 要重定向的新位置
    String site = new String("/demoweb_war/");
    resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
    resp.setHeader("Location", site);
发送邮件
// 使用包
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-email</artifactId>
  <version>1.5</version>
</dependency>

Email email = new SimpleEmail();
email.setHostName("smtp.126.com");
email.setAuthenticator(new DefaultAuthenticator("[email protected]", "TZXHPTADVAKEXHSH"));
email.setSSLOnConnect(true);
try {
    
    
  email.setFrom("[email protected]");
  email.setSubject("TestMail");
  email.setMsg("This is a test mail ... :-)");
  email.addTo("[email protected]");
  email.send();
} catch (EmailException e) {
    
    
  e.printStackTrace();
}

line2

XML

可扩展标记语言(EXtensible Markup Language)

XML DTD

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块

// 1定义规范
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]> 
// 2使用
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
    <date>2008-08-08</date>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
</note>
XML Schema

1.是基于 XML 的 DTD 替代者,是可描述 XML 文档的结构
2.基于XML语法,支持命名空间,大大扩充了数据类型,可以自定义数据类型
3.XML Schema 语言也可作为 XSD(XML Schema Definition)来引用

DOM

DOM接口规范中,有4个接口:
1.Document接口是对文档进行操作的入口,它是从Node接口继承过来的,代表了整个XML/HTML文档,是文档的根,提供了对文档中的数据进行访问和操作的入口。
2.Node接口是其他大多数接口的父类,Document,Element,Attribute,Text,Comment等继承自Node
3.NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。4.NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点

SAX

javax.xml.parsers.SAXParse

SAX(Simple APIs for XML),SAX是事件驱动的,文档的读入过程就是SAX的解析过程,不能随机解析(只能从头开始解析,一点点往后进行),不能修改XML文件,只能进行查询

dom4j
// pom.xml 配置 
<dependency>
  <groupId>org.dom4j</groupId>
  <artifactId>dom4j</artifactId>
  <version>2.1.1</version>
</dependency>

创建一个xml文件


import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;

import java.io.*;

public class XmlTest2 {
    
    
  public void generateDocument() {
    
    
    Document document = DocumentHelper.createDocument();
    Element catalogElement = document.addElement("catalog");
    catalogElement.addComment("An XML Catalog");
    catalogElement.addProcessingInstruction("target", "text");
    Element journalElement = catalogElement.addElement("journal");
    journalElement.addAttribute("title", "XML Zone");
    journalElement.addAttribute("publisher", "IBM developerWorks");
    Element articleElement = journalElement.addElement("article");
    articleElement.addAttribute("level", "Intermediate");
    articleElement.addAttribute("date", "December-2001");
    Element titleElement = articleElement.addElement("title");
    titleElement.setText("Java configuration with XML Schema");
    Element authorElement = articleElement.addElement("author");
    Element firstNameElement = authorElement.addElement("firstname");
    firstNameElement.setText("Marcello");
    Element lastNameElement = authorElement.addElement("lastname");
    lastNameElement.setText("Vitaletti");
    document.addDocType("catalog", null, "file://c:/Dtds/catalog.dtd");
    try {
    
    
      XMLWriter output = new XMLWriter(new FileWriter(new File("d:/books/demo.xml")));
      output.write(document);
      output.close();
    } catch(IOException e){
    
    
      System.out.println(e.getMessage());
    }
  }

  public static void main(String[] argv) {
    
    
    XmlTest2 dom4j = new XmlTest2();
    dom4j.generateDocument();
  }
}
xml命名空间
  • xmlns 是为了防止xml里的元素冲突出现的概念
  • xmlns 表示默认命名空间,使用默认命名空间的作用是, 该元素内部的子元素都会默认属于该命名空间下, 我们不需要为他们一一添加命名空间前缀
  • xsi 已经成为了一个业界默认的用于 XSD((XML Schema Definition) 文件的命名空间
  • XSD 文件 可以理解为 XML 文档可以自定义的语法或格式检查器
  • xsi:schemaLocation 定义了按照空格的键值对,就是 命名空间 : 命名空间所对应的 XSD 文件的位置
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<beans/>


猜你喜欢

转载自blog.csdn.net/qq_29334605/article/details/106712676
今日推荐