zoukankan      html  css  js  c++  java
  • Web---演示servlet技术(servlet生命周期),解决中文乱码问题

    本节讲解决中文乱码问题的4种方法。
    还有更好的方法,也就是用过滤器,这里就不演示了,博主目前也不会~呼♪(^∇^*)~过段时间才会学。

    servlet生命周期演示:

    index.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    
    <html>
        <head>
            <title>
                演示servlet技术
            </title>
        </head>
        <body>
            <h2>演示servlet技术</h2>
            <a href="/myServletDemo/first">访问FirstServlet</a>
            <hr/>
        </body>
    </html>

    FirstServlet.java:

    package cn.hncu.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class FirstServlet implements Servlet{
    
    
        //只有第一次访问才会被执行一次,最先执行一次!
        public FirstServlet() {
            System.out.println("1 构造方法被执行..."+this);
        }
    
    
        //关闭Tomcat服务器时会执行一次。如果是通过myeclipse关闭的,是不会执行的,因为是直接关闭了java虚拟机。
        //最后执行一次
        @Override
        public void destroy() {
            System.out.println("4 destroy..."+this);
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        //第一次被访问才执行,在构造方法之后执行一次!
        @Override
        public void init(ServletConfig config) throws ServletException {
            System.out.println("2 init..."+this);
            String name = config.getInitParameter("name");
            System.out.println("name:"+name);
        }
    
        //每次访问都执行,(第一次)init()后执行
        @Override
        public void service(ServletRequest req, ServletResponse resp)
                throws ServletException, IOException {
            System.out.println("333 servlet"+this);
        }
    
    }
    

    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> 
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    
      <servlet>
        <servlet-name>firstServlet</servlet-name>
        <servlet-class>cn.hncu.servlet.FirstServlet</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>Jack</param-value>
        </init-param>
    
      </servlet>
      <servlet-mapping>
        <servlet-name>firstServlet</servlet-name>
        <url-pattern>/first</url-pattern>
      </servlet-mapping>
    
    </web-app>
    

    配置需要初始化的参数:

    <init-param>
        <param-name>name</param-name>
        <param-value>Jack</param-value>
    </init-param>

    在servlet中:
    用config.getInitParameter(“name”);去得到name参数的值。

    演示结果:

    我们点击访问:访问FirstServlet
    看后台的输出信息:

    不关闭服务器再去访问:

    用myeclipse关闭服务器-因为是直接关闭了java虚拟机,所以不会再运行destroy()方法。也就没有再输出。

    用Tomcat的shutdown.bat关闭服务器:

    解决中文乱码问题

    index.jsp中增加:

    <h2>以下演示用户登录</h2>
            <!-- 要向服务器传中文,前提是用post方式,get方式是肯定不行的 -->
            <form action="/myServlet/login" method="post">
                姓名:<input type="text" name="name"><br/>
                密码:<input type="password" name="pwd"><br/>
                <input type="submit" value="登录">        
            </form>

    web.xml增加的代码:

     <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>cn.hncu.servlet.LoginServlet</servlet-class>     
      </servlet>
    
      <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>   
      </servlet-mapping>
    

    LoginServlet.java:

    package cn.hncu.servlet;
    
    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;
        }
    
    
        private String charset = null;
        @Override
        public void init(ServletConfig config) throws ServletException {
            //法四:
            charset = config.getInitParameter("character");
        }
    
        @Override
        public void service(ServletRequest req, ServletResponse res)
                throws ServletException, IOException {
            //解决中文乱码问题
            //前提:前台页面必须以post方式提交中文---因为post会设置http协议头"Content-Type = application/x-www-form-urlencoded",
            //这样Tomcat才知道这是编码的字符数据
            //法一:在Tomcat的server.xml中的<Connect>中添加一个属性:URLEncoding="utf-8"
            //!!!法一是不可取的,因为Tomcat是公共平台,这个项目只是其中的一个项目,
            //不能把平台看成私有的即最好不要去修改,否则其他项目可能会出现问题
    
    
            //法二:把Tomcat解错的码还原回来
            //这个方法还行,但如果前台传输的很多参数都是中文,那么我们要对每个参数都要进行这样还原,显然比较麻烦。
            //还有,如果以后要改编码,就得改源代码,对客户来说比较麻烦。对程序员也一样
            //String name = req.getParameter("name");
            //byte bs[] = name.getBytes("iso8859-1");
            //name = new String(bs,"utf-8");
            //System.out.println(name);
    
            //法三:这种解决方式是比较好的,但有一个缺点:如果以后要改编码,就得改源代码,对客户来说比较麻烦。对程序员也一样
            //req.setCharacterEncoding("utf-8");
            //String name = req.getParameter("name");
    
            //法四:其实是在web.xml中把编码设置成参数,然后在这里读取出来,利用“法2”进行设置。以后如果要更改编码,只要更改web.xml中的相应参数设置就OK了
            req.setCharacterEncoding(charset);
    
    
            String name = req.getParameter("name");
            String pwd = req.getParameter("pwd");
            //用name和pwd到后台去访问数据库,以验证该用户信息是否正确(登录是否成功)
            //本例不是讲解这个,所以省略。
    
            res.setContentType("text/html;charset=utf-8");//告诉浏览器,我下面发的内容是什么格式的东西,什么编码的
            String html = "<html><body><font color='red'>name:</font>"+name+
                    "<br/><font color='red'>pwd:</font>"+pwd+
                    "</body></html>";
    
            PrintWriter out = res.getWriter();
            out.write(html);
    
    
            //*******另外一个小知识点:
            //Tomcat项目运行时,加载jar包或类文件的顺序:TOMCAT_HOMElib  --> webapps项目名WEB-INFlib  --> webapps项目名WEB-INFclasses目录下面的类
            //后加载的会覆盖前面的---即后加载有效-和java相反(父类加载机制)
    
        }
    
    }
    

    有2个小知识点:

    1:
    Tomcat项目运行时,加载jar包或类文件的顺序:TOMCAT_HOMElib –> webapps项目名WEB-INFlib –> webapps项目名WEB-INFclasses目录下面的类
    后加载的会覆盖前面的—即后加载有效-和java相反(父类加载机制)

    2:

    <!-- 下面这句是用来在服务器启动的时候就new好servlet,也就是说,不用在等第一个客户访问的时候再new了。增加了访问速度。但同时增加了服务器的负荷 -->
        <!--15 这个数字是自己随便给的,如果有多个servlet 数字小的先new,也就是那个数字是决定newservlet的相对顺序的 -->
         <!-- <load-on-startup>15</load-on-startup> -->

    加这个的位置是web.xml中,

    演示结果:

    一开始未写解决中文乱码时的演示结果:

    后台显示:

    用中文乱码解决时(不把每一种方法的结果都演示出来了)

  • 相关阅读:
    C#特性
    C#继承
    对FileStream的几种属性和方法认识
    C# Parallel用法
    c#发布补丁
    WebApi接收接收日期格式参数时,日期类型(2019-10-08T16:00:00.000Z)后台接收时间少8小时问题
    c# 基于WebApi的快速开发框架FastFramework
    c# webapi结合swagger的使用
    windows服务autofac注入quartz任务
    c# autofac结合WebApi的使用
  • 原文地址:https://www.cnblogs.com/webmen/p/5739108.html
Copyright © 2011-2022 走看看