javaEE:day2-servlet生命周期、提交解决中文乱码、tomcat加载jar包或类文件的顺序

servlet生命周期

生命周期简介:

servlet在服务器第一次被请求的时候new出来,并初始化(即init())再调用service方法。这个实在服务器中new出来,然后用HashMap加的,与客户端无关。客户端之后访问只调用这个servlet的service方法。

具体分为4步:

1 构造方法 :服务器在被客户端第一次请求的时候运行 仅在服务器中运行一次

2 init方法:客户端第一次访问服务器的时候在服务器中进行初始化 仅一次。并且可以通过config参数在 web.xml中通过(key,value) 拿到属性值

3 service方法:每次访问都会运行service方法

4 destroy方法 :服务器在关闭服务器时运行一次 ps:这个方法要用tomcat的shutdown关,不能用myeclipse关 不然直接关了虚拟机,来不及与运行这个方法就被关闭了。

启动服务器就new出servlet并初始化

在web.xml中设置<load-on-startup>15</load-on-startup> 这个15是表示优先级,数值越小就越先执行。即在服务器启动的时候就运行这个servlet的1 构造方法和2 init方法。

提交中解决中文乱码问题

前提:前台页面必须以post方式提交中文 —因为post会设置http协议头“Content-Type = application/x-www-form-urlencoded”,这样Tomcat才知道这是编码的字符数据

四种方法:

1 在Tomcat的server.xml中的<Connect>中添加一个属性:URIEncoding="utf-8" 这种方法不可取,因为Tomcat是公共平台,你只是其中的一个项目,不能把平台看成私有的即最好不要去修改,否则其它项目可能会出问题。

2 req.setCharacterEncoding("utf-8"); 这种解决方式是比较好的,但有一个缺点:如果以后要改编码,就得改源代码,对客户来说比较麻烦。对程序员也一样

3 把Tomcat解错的码还原回来—-还行,但如果前台传输的很多参数都是中文,那么我们对每个参数都要这样还原,显然比较麻烦!

        byte bs[] = name.getBytes("iso8859-1");
        name = new String(bs,"utf-8");

4 其实是在web.xml中把编码设置成参数,然后在这里读取出来,利用“法2”进行设置。以后如果要更改编码,只要更改web.xml中的相应参数设置就OK了

在web.xml中设置<init-param> 如下:

<init-param>
        <param-name>charset</param-name>
        <param-value>utf-8</param-value>
    </init-param>

通过init方法的config参数去web.xml中通过

charset = config.getInitParameter("character");
req.setCharacterEncoding(charset);

tomcat加载jar包或类文件的顺序

Tomcat项目运行时,加载jar包或类文件的顺序:TOMCAT_HOME\lib –> webapps\项目名\WEB-INF\lib –> webapps\项目名\WEB-INF\classes目录下面的类,后加载的会覆盖前面的—————即后加载有效

具体实现代码如下:

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>JAVAWEB-DAY3-Servlet技术</title>
  </head>

  <body>
    <a href="first">访问FirstServlet</a>
    <hr/>
    <h2>演示解决中文乱码问题</h2>
    <h1>以下是演示用户登录</h1>
    <form action="login" method="post">
        姓名:<input type="text" name = "name"/><br/>
        密码:<input type="password" name = "pwd"/><br/>
        <input type="submit" value="登录">
    </form>
  </body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>FirstServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.FirstServlet</servlet-class>
    <init-param>
        <param-name>name</param-name>
        <param-value>jack</param-value>
    </init-param>
        <!--
        <load-on-startup>15</load-on-startup>
        -->
  </servlet>
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.LoginServlet</servlet-class>
    <init-param>
        <param-name>charset</param-name>
        <param-value>utf-8</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/first</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

LoginServlet

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class LoginServlet implements Servlet{

    @Override
    public void destroy() {
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public String getServletInfo() {
        return null;
    }
    String charset="";
    @Override
    public void init(ServletConfig config) throws ServletException {
        charset = config.getInitParameter("charset");
    }

    @Override
    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {
        //解决中文乱码只能是在post下才能解决 因为get方式是原样输出,tomcat不知道是否采用了编码。
        //而post方式提交,会设置http协议头“Content-Type = application/x-www-form-urlencoded”,
        //这样Tomcat才知道这是编码的字符数据
        //这里必须在表单提交是post的前提下,设置接受和发送的编码和要发送的内容是什么东西。
        //法1:在在Tomcat的server.xml中的<Connect>中添加一个属性:URIEncoding="utf-8"
        //法1 不可取,因为tomcat是一个公共的平台,我们不能随意更改平台,否则其他项目会出问题的

        //法2:这种解决方式是比较好的,但有一个缺点:如果以后要改编码,就得改源代码,对客户来说比较麻烦。对程序员也一样
        //注意 法2在getParameter之前就要设置编码setCharacterEncoding。

        //req.setCharacterEncoding("utf-8");
        res.setContentType("text/html; charset=utf-8");
        //法4:在web.xml中将编码设置出参数,用init()读取出来,再利用法2 设置
        req.setCharacterEncoding(charset);

        String name = req.getParameter("name");
        String pwd = req.getParameter("pwd");
        //System.out.println(name);
        //法3:把Tomcat解错的码还原回来----还行,但如果前台传输的很多参数都是中文,那么我们对每个参数都要这样还原,显然比较麻烦!
        //byte[] bs = name.getBytes("iso8859-1");
        //String name2 = new String(bs, "utf-8");

        PrintWriter out = res.getWriter();
        String html = "<html><body><font color=‘red‘>name:"+name+"</font><br/><font colr=‘green‘>"+pwd+"</font></body></html>";
        out.print(html);

        //Tomcat项目运行时,加载jar包或类文件的顺序:TOMCAT_HOME\lib  --> webapps\项目名\WEB-INF\lib  --> webapps\项目名\WEB-INF\classes目录下面的类
        //后加载的会覆盖前面的---即后加载有效

    }

}

FirstServlet

package cn.hncu.servlets;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
 * 演示servlet的生命周期
 * @author <a href="mailto:[email protected]">军街</a>
 *
 * @version 1.0 2016-7-17
 */
public class FirstServlet implements Servlet {
    /*
     * 服务器在被客户端第一次请求的时候运行 仅在服务器中运行一次
     */
    public FirstServlet() {
        System.out.println("1 构造方法"+this);
    }

    /*服务器在关闭服务器时运行一次
     * (non-Javadoc)
     * @see javax.servlet.Servlet#destroy()
     */
    @Override
    public void destroy() {
        System.out.println("4 消亡"+this);
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public String getServletInfo() {
        return null;
    }
    /**
     * 客户端第一次访问服务器的时候在服务器中进行初始化  仅一次
     * 可以通过config在 web.xml中通过(key,value) 拿到属性值
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("2 初始化"+this);
        String name = config.getInitParameter("name");
        System.out.println("name:"+name);
    }
    /**
     * 每次访问都会运行service方法
     */
    @Override
    public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException {
        System.out.println("3 访问service方法"+this);
    }
    // <load-on-startup>15</load-on-startup> 中间参数是优先级,越小越先执行
    //这个是在web.xml中
    //设置了这个Servlet在服务器启动就new出来并初始化即运行了1 FirstServlet()和
    //2 init() 两个方法。
}
时间: 2024-10-10 08:42:26

javaEE:day2-servlet生命周期、提交解决中文乱码、tomcat加载jar包或类文件的顺序的相关文章

解决IDEA中Maven加载依赖包慢的问题

原理:maven加载jar包过程,默认的是先扫描本地仓库,若本地仓库没有,则扫描远程仓库下载.默认的conf/settings.xml文件没有配置远程仓库,所以扫描的是maven的中央仓库(在国外),所以慢. 解决方法:配置国内镜像(如阿里云的镜像) 修改conf/settings.xml文件,配置阿里云镜像代码 1 <mirrors> 2 <!-- mirror 3 | Specifies a repository mirror site to use instead of a giv

解决weblogic下通过war加载jar包中的struts的action找不到的问题

今天在功能测试环境中weblogic上部署应用时,启动后报错,说是spring找不到对应的action,所以怀疑是类加载的问题,找度娘一搜,果然是猜的没错,找到解决方法: 1. 将struts.xml加入: <constant name="struts.convention.action.includeJars" value=".*你的jar包名.*" /> 然后启动正常,但登陆后找不到struts的action.在开发环境中明显是可以的,而且在tomc

java压缩解压zip文件,中文乱码还需要ant.jar包

va] view plaincopyprint? package cn.cn; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; i

Web---演示servlet技术(servlet生命周期),解决中文乱码问题

本节讲解决中文乱码问题的4种方法. 还有更好的方法,也就是用过滤器,这里就不演示了,博主目前也不会~呼?(^?^*)~过段时间才会学. servlet生命周期演示: index.jsp: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Tra

Servlet 生命周期与web容器的关系

servlet生命周期由web容器(如tomcat)管理,初始化一次,直到web容器关闭才会被销毁.1.servlet是单例多线程,每个请求过来容器都会启用一个新线程 2.servlet在容器中保持单例,只会被初始化一次 当web.xml中servlet配置load-on-startup为正整数时,容器启动时servlet就会初始化:创建对象->init(ServletConfig config)->init() 当load-on-startup没有设置或值为负数时,servlet要被请求时才

JavaEE实战——Servlet入门、Servlet生命周期、绝对路径、ServletContext

前言 接下来的三篇博客我会分别介绍Servlet的以下三个方面: 1.Servlet程序编写 ----- 生命周期 2.ServletAPI Request Response 3.Cookie 和 Session Servlet的作用:Servlet 用来 动态web资源 开发 静态web资源 : 固定数据文件 动态web资源 : 通过程序动态生成数据文件 Servlet技术基于Request-Response编程模型 ---- HTTP协议也是基于请求响应 模型 * Servlet技术 用来

javaweb学习总结二十一(servlet开发入门、servlet生命周期以及调用过程)

一:servlet开发入门 servlet是sun公司一门开发动态web资源的技术,下面编写一个servlet入门程序: 1:在tomcat服务器webapps目录下新建firstServlet目录,在firstServlet目录下创建WEB-INF/classes目录 在classes目录下,写servlet程序. 类FirstServlet.java 1 /** 2 * 3 */ 4 package com.hlcui.servlet; 5 6 import java.io.IOExcept

测试Servlet生命周期学习笔记

测试环境:windows xp旗舰版 软件环境:myclipse8.5+tomcat7.0 ********************************************************************************* 操作方法: 1.新建工程: File-->new-->Java Project-->TestServlet(工程名称)-->Finish. 2.加载servlet-api.jar类包: TestServlet(右键)-->B

Servlet生命周期与HTTP协议

Servlet生命周期 在web工程中每个Servlet类只会有一个实例化对象,这个实例化对象不能自己创建,只能由web服务器(Tomcat)来创建.这个实例化对象有一个生命周期,也就是所谓的Servlet生命周期. Servlet生命周期分为三个阶段: 初始化阶段 有两种情况下会进入初始化阶段,这个阶段是Servlet生命周期的开始.第一种情况是当浏览器第一次进行访问时(注意是第一次),web服务器会去实例化Servlet对象,实例化Servlet对象完成后会把对象放在Servlet实例池中,