servlet web应用基础(2)

目录

Servlet写helloworld

servlet流程图

Myeclipse创建web项目

servlet线程安全

Servlet解决单线程的方式 实现接口SingleThreadModel

 servletconfig对象

servletcontext对象


Servlet写helloworld

 

编写第一个项目

在webapps 创建test项目

 WEB-INF/classes

FirstServlet.java

package cn.cast;



import java.io.*;

import javax.servlet.*;

public class FirstServlet extends GenericServlet{

public void service(ServletRequest req,ServletResponse res)throws ServletException,IOException{

OutputStream out = res.getOutputStream();

out.write("hello servlet".getBytes());

}

}

编译 javac –d . FirstServlet.java  报错  将tomcat 下面的servlet包加入系统环境变量  D:\tomcat-8.0.35\apache-tomcat-8.0.35\lib\servlet-api.jar 加入classpath

重新执行编译成功

在WEB-INF下web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee

                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

  version="3.1">



    <servlet>

        <servlet-name>FirstServlet</servlet-name>

        <servlet-class>cn. cast.FirstServlet</servlet-class>

       

    </servlet>



    <servlet-mapping>

        <servlet-name>FirstServlet</servlet-name>

        <url-pattern>/FirstServlet</url-pattern>

    </servlet-mapping>

</web-app>

重启服务器 访问:http://localhost:8080/test/FirstServlet   出现hello servlet

servlet流程图

 

 

Myeclipse创建web项目

 

 

选择no 使用java225.0  然后使用6.0的编译器:

将需要的jar包放到lib目录并且导入:

 

创建servlet  继承GenericServlet


 

package cn.cast;



import java.io.IOException;



import javax.servlet.GenericServlet;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;



public class ServletDemo extends GenericServlet {



    @Override

    public void service(ServletRequest req, ServletResponse res)

            throws ServletException, IOException {

        res.getOutputStream().write("hello servlet!!!!!!!!!".getBytes());

       

    }





}

在web.xml中配置对外访问路径:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5"

    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_2_5.xsd">

   

   

    <servlet>

    <servlet-name>servletdemo1</servlet-name>

    <servlet-class>cn.cast.ServletDemo</servlet-class>

    </servlet>

  <servlet>

    <servlet-name>ServletDemo2</servlet-name>

    <servlet-class>cn.cast.ServletDemo2</servlet-class>

  </servlet>



   

    <servlet-mapping>

    <servlet-name>servletdemo1</servlet-name>

    <url-pattern>/servletdemo1</url-pattern>

    </servlet-mapping>

  <servlet-mapping>

    <servlet-name>ServletDemo2</servlet-name>

    <url-pattern>/servlet/ServletDemo2</url-pattern>

  </servlet-mapping>

   

  <display-name></display-name>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

</web-app>

发布项目

集成tomcat

Windows ---preferences---myeclipse----servers ----tomcat

选择tomcat版本并选择路径  设置为enabled 启用  (tomcat可设置jdk的版本号 默认不修改  启动模式为debug模式)

 

将项目发布到服务器  并启动tomcat 

 

访问

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

官方文档:

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html

 

httpservlet

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html

 

新建一个servlet myeclispse 可之间创建并且在web.xml中配置访问路径
 

package cn.cast;

import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class ServletDemo2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        response.getOutputStream().write("hello httpservlet!!!".getBytes());

       

    }



    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);//不管是post還是get方法都由doGet方法處理。

    }



}

重启tomcat

访问:http://localhost:8080/web1/ServletDemo2

 

@@@@@@@@@@@@@@@@@@@@@@

 

 

服务器自动加载web.xml 更改了web.xml文件中的内容时候,不需要重启服务。

 

 

 

验证服务器智慧创建一次servlet 

新建servletDemo3

package cn.cast;



import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class ServletDemo3 extends HttpServlet {





    @Override

    public void destroy() {

        // TODO Auto-generated method stub

        super.destroy();

        System.out.println("destroy!");

    }



    @Override

    public void init(ServletConfig config) throws ServletException {

        // TODO Auto-generated method stub

        super.init(config);

        System.out.println("init");

    }



    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {



    }



    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);



    }



}

 

 

在浏览器访问http://localhost:8080/web1/servlet/ServletDemo3

在控制台显示init  多次访问也只显示一次。

 

 

 

缺省的servlet默认不配置,

servlet线程安全

 

Servlet如果操作了共享资源,需要注意线程安全的问题。

package cn.cast;



import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class ServletDemo4 extends HttpServlet {



    /**

    线程安全

     */

   

    //放在外面线程不安全。

    int i=0;

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        //变量放在里面线程是安全的

        //int i=0;

       

        //在实际web资源访问中是不可行的,同事只能有一个连接访问,其他的连接等待。

        synchronized (this) {

            i++;

            try {

                Thread.sleep(1000*10);

            } catch (InterruptedException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

           

            response.getOutputStream().write((i+"").getBytes());

        }

       





    }





    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }



}

 

Servlet解决单线程的方式 实现接口SingleThreadModel

方法是当一个请求没有访问没有完毕后,创建一个新的servlet来响应新的请求。

package cn.cast;



import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletException;

import javax.servlet.SingleThreadModel;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class ServletDemo4 extends HttpServlet implements SingleThreadModel{

    int i=0;

    //子类在覆盖父类的方法时,不能抛出比父类更多的异常。

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        i++;

        try {

            Thread.sleep(1000*4);

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        response.getOutputStream().write((i+"").getBytes());

    }



    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }



}



 servletconfig对象

Servletconfig用于封装servlet的配置信息,应用场景  :

在配置数据库连接 字符集等  配置文件等,不适合在程序中写死方便切换的数据。

Web.xml

  <servlet>

    <servlet-name>ServletDemo5</servlet-name>

    <servlet-class>cn.cast.ServletDemo5</servlet-class>

   

    <init-param>

    <param-name>data</param-name>

    <param-value>xxx</param-value>

    </init-param>

    <init-param>

    <param-name>data2</param-name>

    <param-value>yyy</param-value>

    </init-param>

    <init-param>

    <param-name>data3</param-name>

    <param-value>zzz</param-value>

    </init-param>

  </servlet>

  <servlet-mapping>

    <servlet-name>ServletDemo5</servlet-name>

    <url-pattern>/servlet/ServletDemo5</url-pattern>

  </servlet-mapping>Servlet对象
package cn.cast;



import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;



import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class ServletDemo5 extends HttpServlet {



    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

       

        ServletConfig config = this.getServletConfig();

       

        //得到指定的 参数

        String value = config.getInitParameter("data");

        System.out.println(value);

       

        //得到所有的参数 

        Enumeration e = config.getInitParameterNames();

        while (e.hasMoreElements()){

            String name = (String) e.nextElement();

            String value1 = config.getInitParameter(name);

            System.out.println(value1);

        }

    }



    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }



}



访问在控制台输出 xxx

 

servletcontext对象

 

ServletDemo6  存入数据

package cn.cast;



import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;





//servletcontext实例

public class ServletDemo6 extends HttpServlet {

   

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        //得到servletcontext方式一

        ServletContext context = this.getServletConfig().getServletContext();

        //得到servletcontext方式二

        context = this.getServletContext();

       

        context.setAttribute("data", "xxx");

   

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {



        doGet(request, response);

    }



}

ServletDemo6  读取数据

package cn.cast;



import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletConfig;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class ServletDemo5 extends HttpServlet {



    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

       

        /*ServletConfig config = this.getServletConfig();

        String value = config.getInitParameter("data");

        System.out.println(value);*/

        ServletContext context = this.getServletContext();

        String value = (String) context.getAttribute("data");

        System.out.println(value);

       

    }



    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }



}

 

 

应用场景:多个servlet项目之间实现数据共享。可以应用在聊天室。

Servletcontext

  1. 这是一个容器
  2. Servletcontext域说明了这个容器范围,也就是应用程序范围。

 

猜你喜欢

转载自blog.csdn.net/qq_38125626/article/details/83144142
今日推荐