zoukankan      html  css  js  c++  java
  • Servlet问题

    1.今天开始学习servlet技术,一开始主要是了解一下servlet的概念,优点。Servlet的生命周期,首先是创建一个servlet类,自动加载形成servlet实例,之后一直等待用户请求,如果有请求,则会接受请求,调用service方法,并将结果返回到客户端,之后又会继续等待下一个请求,或者由服务器调用destroy方法卸载。Servlet生命周期执行的三个函数有init(),service(),destroy()。除了service方法可以执行多次之外,其他2个方法都只能执行1次。

     

    2.学会开发,部署一个简单的servlet。首先就是编写一个servlet的程序,放在WEB-INF/classes/test目录下,之后就是在classpath中加入servlet-api.jar和jsp-api.jar的路径,之后再编译servlet程序,之后就是建立一个web.xml文件来告诉servlet容器servlet类在哪个位置,最后一定要做的一步就是重启tomcat服务器。

    具体步骤如下:

    我写了一个简单的Hello程序,代码如下

    package test;
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class Hello extends HttpServlet
    {
    public void init(ServletConfig config) throws ServletException
    {
    super.init(config);
    }

    public void service(HttpServletRequest request,HttpServletResponse response) throws IOException
    {
    PrintWriter out
    =response.getWriter();
    response.setContentType(
    "text/html;charse=GB2312");
    out.print(
    "<HTML><BODY>");
    out.print(
    "hello,servlet");
    out.print(
    "</body></html>");
    }

    public void destroy()
    {
    }
    }

    如果直接编译的话,会说找不到javax.servlet包,javax.servlet.http。。。。因为我们还没有配置环境变量,右键我的电脑,属性,高级,如下图

    之后点击环境变量

    选择系统变量里面的classpath

    在变量值那里添加...假设我的apache装在c:\program files\apache software foundation\tomcat 6.0目录下的话

    ;c:\program files\apache software foundation\tomcat 6.0\lib\jsp-api.jar;c:\program files\apache software foundation\tomcat 6.0\lib\servlet-api.jar

    之后我再建一个web.xml文件来告诉servlet容器servlet类放在哪里了

    <?xml version="1.0" encoding="iso-8859-1"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
    ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd" version="2.5">
    <servlet>
    <servlet-name>Hello</servlet-name>
    <servlet-class>test.Hello</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/Hello</url-pattern>
    </servlet-mapping>
    </web-app>

    3.servlet之间的协作

         如何进行servlet之间的协作,servlet之间是可以互相通信的。下面我写了一个rud1的servlet,主要是接收由jsp页面传递过来的参数

    name1和name2参数,如果是空值,则回到jsp页面。如果name1=li&&name2=123则转到rud2这个servlet,其他则转回jsp

    代码
    package test;
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;

    public class Rud1 extends HttpServlet
    {
        
    private static final String CONTENT_TYPE="text/html;charset=GBK";
        
    public void init() throws ServletException
        {
            
    //super.init(config);
        }
        
    public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
        {
            doGet(request,response);
        }
        
        
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
        {
            
    //doPost(request,response);
            String name1=request.getParameter("name1");
            String name2
    =request.getParameter("name2");
            
    if(name1.equals("")|name2.equals(""))
            {
                RequestDispatcher rd
    =getServletContext().getRequestDispatcher("/Dia.jsp");
                rd.include(request,response);
            }
            
    byte[] b=name1.getBytes("iso-8859-1");
            name1
    =new String(b);
            
    byte[] bb=name2.getBytes("iso-8859-1");
            name2
    =new String(bb);
            
    if(name1.equals("li")&&name2.equals("123"))
            {
                RequestDispatcher rd1
    =getServletContext().getRequestDispatcher("/Rud2");
                rd1.forward(request,response);
            }
            
    else
            {
                RequestDispatcher rd2
    =getServletContext().getRequestDispatcher("/Dia.jsp");
                rd2.forward(request,response);
            }
        }
        
        
    public void destroy()
        {
            
        }
    }

    主要是用了

    void forward(ServletRequest request,ServletResponse response)throws ServletException,IOException
    void include(ServletRequest request,ServletResponse response)throws ServletException,IOException
    两个都是跳转函数,forward是转发到服务器上的另一个资源,并把控制权交给目标servlet
    include是把资源包含到响应当中。

    我试过用2个方法来进行跳转,发现用forward是不会出现乱码,但是用include则会出现乱码,具体原因还在研究当中

    forward是转发的另一个页面.
    include是把另一个页面加载到当前页面.

  • 相关阅读:
    OCP 062【中文】考试题库(cuug内部资料)第29题
    413. 等差数列划分 力扣(中等) 找规律,细节
    264. 丑数 II 力扣(中等) 动态规划,不会
    313. 超级丑数 力扣(中等) 动态规划,不会做
    5840. 使字符串平衡的最小交换次数 力扣(中等) 第255场oppo周赛 猜出来的
    手写一个仿微信登录的Nodejs程序
    你不知道的CSS国际化
    React实现类似淘宝tab居中切换效果
    原来 CSS 这样写是会让 App 崩溃的
    css中class和id之间有什么区别?
  • 原文地址:https://www.cnblogs.com/cookies9/p/1886377.html
Copyright © 2011-2022 走看看