欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java Servlet的配置

程序员文章站 2022-07-01 16:32:39
配置Servlet映射 只能使用/TestServlet来访问,使用其他的比如/TestServlet/xxx是访问不了的。 第一个/表示项目根目录。 可以使用. /servlet.TestServlet 访问时以 /servlet.TestSe ......

 

配置servlet映射

 <servlet>
        <servlet-name>testservlet</servlet-name>
        <servlet-class>servlet.testservlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>testservlet</servlet-name>
        <url-pattern>/testservlet</url-pattern>
    </servlet-mapping>

只能使用/testservlet来访问,使用其他的比如/testservlet/xxx是访问不了的。

第一个/表示项目根目录。

 

 

可以使用. 

<url-pattern>/servlet.testservlet</url-pattern> 

访问时以 /servlet.testservlet 来访问。注意不是通过/servlet/testservlet来访问。

 

 

可以使用/

<url-pattern>/servlet/testservlet</url-pattern>

访问时以 /servlet/testservlet 来访问

 

 

可以使用通配符*

<url-pattern>/*</url-pattern>

匹配所有请求。

 

 

多重映射:一个servlet配置多个<url-pattern>,可通过多个路径来访问。

<servlet-mapping>
        <servlet-name>testservlet</servlet-name>
        <url-pattern>/testservlet1</url-pattern>
        <url-pattern>/testservlet2</url-pattern>
    </servlet-mapping>

既可通过/testservlet1来访问,又可通过/testservlet2来访问。

 

 

配置 load-on-startup

<servlet>
        <servlet-name>testservlet</servlet-name>
        <servlet-class>servlet.testservlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

配置了<load-on-startup></load-on-startup>的servlet会在servlet容器(比如tomcat)启动时就创建此servlet的实例。

参数是一个整数,值越小的越先创建(初始化)。

 

 

 

 

 

配置某个servlet的初始化参数

<servlet>
        <servlet-name>testservlet</servlet-name>
        <servlet-class>servlet.testservlet</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>张三</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>18</param-value>
        </init-param>
    </servlet>

一个<init-param>设置一个参数。可以设置多个。

 

 

在servlet中使用servletconfig获取当前servlet的初始化参数

 1 public class testservlet extends httpservlet {
 2     protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {
 3         doget(request, response);
 4     }
 5 
 6     protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {
 7         response.setcontenttype("text/html;charset=utf-8");  // //设置响应输出流的编码格式。若不设置,中文会乱码。
 8         printwriter writer = response.getwriter();  //获取响应输出流
 9         servletconfig servletconfig=this.getservletconfig();  //this表示当前servlet。可缺省this,直接调用getservletcontext()
10 
11         //获取单个参数值
12         string name = servletconfig.getinitparameter("name"); //返回值是string
13         string age = servletconfig.getinitparameter("age");
14         writer.write("name:"+name+"<br />");   //输出会以html的形式显示,所以可以使用html标签。
15         writer.write("age:"+age);
16 
17         writer.write("<hr />");
18 
19         //遍历
20         enumeration<string> initparameternames = servletconfig.getinitparameternames();  //里面的元素是参数名
21         while (initparameternames.hasmoreelements()){
22             string paramname=initparameternames.nextelement();  //参数名
23             string paramvalue=servletconfig.getinitparameter(paramname);  //参数值
24             writer.write(paramname+":"+paramvalue+"<br />");
25         }
26 
27 
28     }
29 }

 

 

说明

  • 如果响应中包含中文,需要设置设置响应的编码字符集。有2种设置方式

    response.setcontenttype("text/html;charset=utf-8");  
    response.setcharacterencoding("utf-8");

这两种方式都可以解决响应中文乱码的问题(准确来说不是乱码,是显示为?识别不了)。区别是:第一种设置了输出文档是html,所以可以输出html文档中的内容,比如:

    printwriter writer = response.getwriter();  
        writer.write("<h2>hello</h2>");   
        writer.write("<script>alert('hello')</script>");

这些html标签都会被解析,js脚本是有效的。

第二种只设置了响应字符集为utf-8,并没有设置响应是html文档,解析不了响应中的html标签。

 

 

  • 设置响应字符集的这句代码必须放在获取响应输出流的代码之前。

    response.setcontenttype("text/html;charset=utf-8");
        printwriter writer = response.getwriter();

如果放在了获取响应输出流的代码之后,则设置的字符集无效。

 

 

  • 解决请求参数中的中文乱码

request.setcharacterencoding("utf-8");

习惯上把设置request、response字符集的这两句代码放在doget() | dopost() 里的最前面。

 

 

  • 如果我们想在响应输出流中输出换行,使用<br />,而非\n。

     response.setcontenttype("text/html;charset=utf-8");
        printwriter writer = response.getwriter();
        writer.write("hello<br />");

设置响应输出流是html文档,换行自然要用<br />,\n在html中换不了行。

 

 

 

 

 

配置整个web应用的初始化参数,所有servlet共享

既然是所有servlet公有的,那就应该直接放在<web-app>下。

<context-param>
        <param-name>name</param-name>
        <param-value>chy</param-value>
    </context-param>

    <context-param>
        <param-name>age</param-name>
        <param-value>20</param-value>
    </context-param>

一个<context-param>配置一个参数,可配置多个参数。

 

 

在servlet中获取参数值

 1 response.setcontenttype("text/html;charset=utf-8");
 2         printwriter writer = response.getwriter();
 3         servletcontext context=this.getservletcontext();  //可缺省this,直接调用getservletcontext()
 4 
 5         //获取单个参数值
 6         string name = context.getinitparameter("name");
 7         string age = context.getinitparameter("age");
 8         writer.write("name:"+name+"<br />");
 9         writer.write("age:"+age);
10 
11         writer.write("<hr />");
12 
13         //遍历
14         enumeration<string> initparameternames =context.getinitparameternames();  //里面的元素是参数名
15         while (initparameternames.hasmoreelements()){
16             string paramname=initparameternames.nextelement();  //参数名
17             string paramvalue=context.getinitparameter(paramname);  //参数值
18             writer.write(paramname+":"+paramvalue+"<br />");
19         }

 

我们注意到通过servletcontext对象获取东西参数名、参数值、enumeration对象的三个方法都是getinitparameterxxx()。为什么是init?

 

servletconfig表示当前servlet的初始化配置。

 

servletcontext表示整个web应用中所有servlet的共享数据。共享数据有2个部分:

  • 在xml中通过<context-param>配置的初始化参数,这部分数据要通过servletcontext实例的getinitparameterxxx()来获取
  • 另一部分共享数据是在web应用运行中通过setattribute()添加|设置的,需要使用getattribute()来获取。

这2部分数据是分开的、独立的,操作数据的方法也是独立的一套。

 

 

 

 

整个web应用的共享数据

在一个servlet中:

    servletcontext context=getservletcontext();  //可缺省this
        context.setattribute("name","chy");
        context.setattribute("age",20);  

设置的数据是所有servlet共享的,在其他servlet中可以修改、获取这些数据。

 

在另一个servlet中使用:

 //获取单个属性值
        string name= (string) servletcontext.getattribute("name");  //获取的是属性值都是object,需要强转
        int age= (int) servletcontext.getattribute("age");
        
        //遍历
        enumeration<string> attributenames = servletcontext.getattributenames();
        while (attributenames.hasmoreelements()){
            string attributename=attributenames.nextelement();  //属性名是string
            object attributevalue = servletcontext.getattribute(attributename);  //属性值是object,需要强转
            //...
        }

 

需要先访问前一个servlet。先设置了数据,才取得出来。

如果要移除某个共享数据,可以使用 removeattribute(string name) 。

 

获取servletconfig对象、servletcontext对象,可以使用this,也可以缺省this,直接写getservletconfig|context()。

因为getservletconfig()获取的只能是当前servlet的初始化配置,是唯一的;

getservletcontext()获取的只能是当前webapp中的共享数据,也是唯一的;

不需要this。

 

获取当前servlet的初始化参数时,可以不要servletconfig对象,直接写 getinitparameter()、getinitparameternames()。

因为当前的servlet是唯一的、确定的。

 

 

 

 使用servletcontext读取资源文件

1 servletcontext servletcontext = getservletcontext();
2         inputstream is = servletcontext.getresourceasstream("/test.properties"); 
3         properties properties = new properties();
4         properties.load(is);

 

 

 

 

配置tomcat数据源

1、在tomcat->conf->context.xml中配置数据源

<context>

    <watchedresource>web-inf/web.xml</watchedresource>
    <watchedresource>web-inf/tomcat-web.xml</watchedresource>
    <watchedresource>${catalina.base}/conf/web.xml</watchedresource>

 <resource name="jdbc/mysql"
        type="javax.sql.datasource"
        driverclassname="com.mysql.cj.jdbc.driver"
        url="jdbc:mysql://localhost:3306/my_db?servertimezone=gmt"
        username="chy"
        password="abcd"  />

</context>

<watchedresource>是自带的,不用管。

一个<resource>配置一个资源,可同时配置多个资源。<resource>的name属性唯一标识此资源,数据源的name常用jdbc/xxx来命名。tomcat中配置的资源是全局的,所有webapp都可以通过name引用。

type指定资源类型是数据源。tomcat的内置数据源是dbcp,所以参数要是dbcp的参数,可在<resource>中配置dbcp中可配置的所有参数。

 

需要把数据库驱动添加到tomat的lib中。

说明:tomcat自带java web常用的jar包。使用tomcat运行webapp时,默认会自动使用tomcat\lib下的servlet-api.jar、jsp-api.jar这2个包,所以我们不必手动添加这2个包的依赖。当然把java ee的jar包添加进来也行。

Java  Servlet的配置

 

Java  Servlet的配置

 

 

 

2、在webapp的web.xml中引用tomcat数据源

<resource-ref>
        <res-ref-name>jdbc/mysql</res-ref-name>
        <res-type>javax.sql.datasource</res-type>
    </resource-ref>

配置在<web-app>中,一个<resource-ref>配置一个资源引用,<res-ref-name>指定要引用的资源的name(对应tomcat中资源的name),res-type指定所引用资源的类型。

这2个子元素的位置可以互换,但在某些版本的idea中,如果type写在前,name写在后,type会报红,这是idea本身的问题,代码没有错。

 

 

3、在servlet中使用数据源

   initialcontext initialcontext = new initialcontext();
            context context = (context) initialcontext.lookup("java:comp/env");  //返回值是object,需要强转。参数是固定的。
            datasource datasource = (datasource)context.lookup("jdbc/mysql");  //获取数据源,参数是资源的name。返回值是object,需要强转
            connection connection = datasource.getconnection();
            

 

 

 

 

 

使用注解配置servlet

从servlet3.0开始,可以使用注解来配置servlet。

@webservlet(
  name = "testservlet",
  urlpatterns = { "/servlet/testservlet" },
  loadonstartup = 1,
  initparams = {@webinitparam(name = "name", value = "张三"),@webinitparam(name="age",value="12")}
)
public class testservlet extends httpservlet {
  //......
}

name指定此servlet的name,缺省时默认为此servlet的全限定类名。

urlpatterns、value指定映射,二者完全等价。多重映射写成字符串数组的形式,如果只有一个映射关系,可以直接写成字符串。

loadonstartup,即<load-on-startup>。

initparams指定此servlet的初始化参数,数组形式。一个@webinitparam配置一个初始化参数,name、value均为string。

 

以上参数均可缺省,但一般都要配置value | urlpatterns。

参数只有value | urlpatterns时可以缺省value | urlpatterns,直接写参数值。

@webservlet("/servlet/testservlet")