您的位置:首页 > 其它

Servlet(1)

2016-08-04 01:49 281 查看
什么是Servlet:

缺省Servlet:

如果某个Servlet的映射路径仅仅为一个正斜杠(/)(代表当前应用),那么这个Servlet就成为当前Web应用程序的缺省Servlet;

凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理;

在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。

当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet

辨析:根目录(/)在不同地方的不同含义

(a)Jsp页面(*.jsp)中的/代表服务器根目录

(b)web.xml配置文件中/代表项目(网站)根目录

(c)请求转发/代表项目根目录

(d)请求重定向/代表服务器根目录

ServletContext:当前应用的servlet容器

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。由服务器自动创建哦!

获取ServletContext对象(通常也被称为context域对象,对应jsp九大内置对象中的application对象)的几种方式

public void doGet(HttpServletRequest request,HttpServletResponse response)

{

    直接获取:ServletContext context=this.getServletContext();

    通过ServletConfig对象间接获取:ServletContext context=this.getServletConfig()s.getServletContext();

}

ServletContext对象的运用:

1.请求转发

  public void doGet(HttpServletRequest request,HttpServletResponse response)

{

   ServletContext context=this.getServletContext();

   RequestDispatcher rd=context.getRequestDispatcher("/index.jsp");//获取请求转发对象 指定目标页面

   rd.forward(request,response);//进行转发

}

2.读取xml配置文件应用初始化参数,

 在配置文件中这样设置应用初始化参数(notice:不是servlet初始化参数哦!):

  <context-param>

    <param-name>...</param-name>

    <param-value>...</param-value>

  </context-param>

 在servlet中这样读取应用参数

  ServletContext context=this.getServletContext();

  context.getInitParameter(参数名);

3.读取propertier配置文件

********************************************************************************************************

 方式1:

  InputStream in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");    *

  Properties prop=new Properties();//将以键值对的形式保存数据map                                        *

  prop.load(in);//将输入流对象载入到Properties对象                                                      *

  //读数据                                                                                              *

  String value1=prop.getProperty("...");  

 方式2:

 String realPath=this.getServletContext().getRealPath(/WEB-INF/classes/db.properties);//获取在硬盘的真实路径

 FileInputStream in=new FileInputStream(realPath);

***********************************************************                                           

notice:相互之间没有关系的数据写在properties配置文件。有结构关系的数据写在xml配置文件中                      

4.聊天室(共享数据)、点击量统计

HttpServletRequest和HttpServletResponse对象:对于每一次请求,服务器自动创建这两个类的实例对象

servlet防乱码的两种方式:

public void doGet(HttpServletRequest request,HttpServletResponse response)

{

    

      response.setCharacterEncoding("UTF-8");//控制服务器发送方式

       response.setHeader("content-type","text/html;charset=UTF-8");//控制浏览器打开方式

    //以上两条等价于下面这一条

     response.setContentType("text/html;charset=UTF-8");

}

利用HttpServletResponse对象实现文件下载:

public void doGet(HttpServletRequest request,HttpServletResponse response)

{

    String path=this.getServletContext().getRealPath("/downloads/当当.jpg");//获取文件在磁盘的绝对路径

        String filename=path.substring(path.lastIndexOf("\\"+1));截取文件名,注意转义反斜杠\

        response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(filename,"UTF-8));//设置头信息,对中文文件名实现转码

    

    InputStream in=new FileInputStream("path");//创建文件输入流对象,与文件建立链接

    OutputStream out=response.getOutputStream();

        try{

        int len=0;

                byte buffer[]=new byte[1024];

                while((len=in.read(buffer)>0){

            out.write(buffer,0,len);//将字节数组的内容输出到浏览器

        }

    }finally{

        if(in!=null){

            try{

            

                in.close()//关闭文件输入流;自己new的要自己关,通过系统获取的(比如本例中的out)不用自己关,服务器会自动进行相关处理

            }catch(Exception e){

                e.printStacktrace();

                        }

        }

    }

        

}

利用HttpServletRequest对象实现请求转发:

doGet(HttpServletRequest request, HttpServletResponse response)

    {

        request.getRequestDispatcher("/index.jsp").forward(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp) ;转发根目录/是该web应用

        或者通过ServletContext对象获取请求转发对象再进行转发:

                ServletContext context=this.getServletContext();

                RequestDispatcher rd=context.getRequestDispatcher("/index.jsp");//获取请求转发对象 指定目标页面

        rd.forward(request,response);//进行转发

        

    }

利用HttpServletResponse对象实现请求重定向:

doGet(HttpServletRequest request, HttpServletResponse response)

    {

        response.sendRedirect("/Lihao/index.jsp");重定向根目录/是承载该应用的服务器根目录(这里应该是webapp目录吧。。)

    }

notice:转发(当前请求的延续)算是同一个请求,从定向(一个全新的请求)则不是

       调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;

       调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

什么是Servlet:

缺省Servlet:

如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet;

凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理;

在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。

当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet

辨析:根目录(/)在不同地方的不同含义

(a)页面中的/代表服务器根目录

(b)web.xml配置文件中/代表项目(网站)根目录

(c)请求转发/代表项目根目录

(d)请求重定向/代表服务器根目录

ServletContext:当前应用的servlet容器

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。由服务器自动创建哦!

获取ServletContext对象(通常也被称为context域对象,对应jsp九大内置对象中的application对象)的几种方式

public void doGet(HttpServletRequest request,HttpServletResponse response)

{

    直接获取:ServletContext context=this.getServletContext();

    通过ServletConfig对象间接获取:ServletContext context=this.getServletConfig()s.getServletContext();

}

ServletContext对象的运用:

1.请求转发

  public void doGet(HttpServletRequest request,HttpServletResponse response)

{

   ServletContext context=this.getServletContext();

   RequestDispatcher rd=context.getRequestDispatcher("/index.jsp");//获取请求转发对象 指定目标页面

   rd.forward(request,response);//进行转发

}

2.读取xml配置文件应用初始化参数,

 在配置文件中这样设置应用初始化参数(notice:不是servlet初始化参数哦!):

  <context-param>

    <param-name>...</param-name>

    <param-value>...</param-value>

  </context-param>

 在servlet中这样读取应用参数

  ServletContext context=this.getServletContext();

  context.getInitParameter(参数名);

3.读取propertier配置文件

********************************************************************************************************

 方式1:

  InputStream in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");    *

  Properties prop=new Properties();//将以键值对的形式保存数据map                                        *

  prop.load(in);//将输入流对象载入到Properties对象                                                      *

  //读数据                                                                                              *

  String value1=prop.getProperty("...");  

 方式2:

 String realPath=this.getServletContext().getRealPath(/WEB-INF/classes/db.properties);//获取在硬盘的真实路径

 FileInputStream in=new FileInputStream(realPath);

***********************************************************                                           

notice:相互之间没有关系的数据写在properties配置文件。有结构关系的数据写在xml配置文件中                      

4.聊天室(共享数据)、点击量统计

HttpServletRequest和HttpServletResponse对象:对于每一次请求,服务器自动创建这两个类的实例对象

servlet防乱码的两种方式:

public void doGet(HttpServletRequest request,HttpServletResponse response)

{

    

      response.setCharacterEncoding("UTF-8");//控制服务器发送方式

       response.setHeader("content-type","text/html;charset=UTF-8");//控制浏览器打开方式

    //以上两条等价于下面这一条

     response.setContentType("text/html;charset=UTF-8");

}

利用HttpServletResponse对象实现文件下载:

public void doGet(HttpServletRequest request,HttpServletResponse response)

{

    String path=this.getServletContext().getRealPath("/downloads/当当.jpg");//获取文件在磁盘的绝对路径

        String filename=path.substring(path.lastIndexOf("\\"+1));截取文件名,注意转义反斜杠\

        response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(filename,"UTF-8));//设置头信息,对中文文件名实现转码

    

    InputStream in=new FileInputStream("path");//创建文件输入流对象,与文件建立链接

    OutputStream out=response.getOutputStream();

        try{

        int len=0;

                byte buffer[]=new byte[1024];

                while((len=in.read(buffer)>0){

            out.write(buffer,0,len);//将字节数组的内容输出到浏览器

        }

    }finally{

        if(in!=null){

            try{

            

                in.close()//关闭文件输入流;自己new的要自己关,通过系统获取的(比如本例中的out)不用自己关,服务器会自动进行相关处理

            }catch(Exception e){

                e.printStacktrace();

                        }

        }

    }

        

}

利用HttpServletRequest对象实现请求转发:

doGet(HttpServletRequest request, HttpServletResponse response)

    {

        request.getRequestDispatcher("/index.jsp").forward(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp) ;转发根目录/是该web应用

        或者通过ServletContext对象获取请求转发对象再进行转发:

                ServletContext context=this.getServletContext();

                RequestDispatcher rd=context.getRequestDispatcher("/index.jsp");//获取请求转发对象 指定目标页面

        rd.forward(request,response);//进行转发

        

    }

利用HttpServletResponse对象实现请求重定向:

doGet(HttpServletRequest request, HttpServletResponse response)

    {

        response.sendRedirect("/Lihao/index.jsp");重定向根目录/是承载该应用的服务器根目录(这里应该是webapp目录吧。。)

    }

notice:转发(当前请求的延续)算是同一个请求,从定向(一个全新的请求)则不是

       调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;

       调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

什么是Servlet:

缺省Servlet:

如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet;

凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理;

在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。

当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet

辨析:根目录(/)在不同地方的不同含义

(a)页面中的/代表服务器根目录

(b)web.xml配置文件中/代表项目(网站)根目录

(c)请求转发/代表项目根目录

(d)请求重定向/代表服务器根目录

ServletContext:当前应用的servlet容器

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。由服务器自动创建哦!

获取ServletContext对象(通常也被称为context域对象,对应jsp九大内置对象中的application对象)的几种方式

public void doGet(HttpServletRequest request,HttpServletResponse response)

{

    直接获取:ServletContext context=this.getServletContext();

    通过ServletConfig对象间接获取:ServletContext context=this.getServletConfig()s.getServletContext();

}

ServletContext对象的运用:

1.请求转发

  public void doGet(HttpServletRequest request,HttpServletResponse response)

{

   ServletContext context=this.getServletContext();

   RequestDispatcher rd=context.getRequestDispatcher("/index.jsp");//获取请求转发对象 指定目标页面

   rd.forward(request,response);//进行转发

}

2.读取xml配置文件应用初始化参数,

 在配置文件中这样设置应用初始化参数(notice:不是servlet初始化参数哦!):

  <context-param>

    <param-name>...</param-name>

    <param-value>...</param-value>

  </context-param>

 在servlet中这样读取应用参数

  ServletContext context=this.getServletContext();

  context.getInitParameter(参数名);

3.读取propertier配置文件

********************************************************************************************************

 方式1:

  InputStream in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");    *

  Properties prop=new Properties();//将以键值对的形式保存数据map                                        *

  prop.load(in);//将输入流对象载入到Properties对象                                                      *

  //读数据                                                                                              *

  String value1=prop.getProperty("...");  

 方式2:

 String realPath=this.getServletContext().getRealPath(/WEB-INF/classes/db.properties);//获取在硬盘的真实路径

 FileInputStream in=new FileInputStream(realPath);

***********************************************************                                           

notice:相互之间没有关系的数据写在properties配置文件。有结构关系的数据写在xml配置文件中                      

4.聊天室(共享数据)、点击量统计

HttpServletRequest和HttpServletResponse对象:对于每一次请求,服务器自动创建这两个类的实例对象

servlet防乱码的两种方式:

public void doGet(HttpServletRequest request,HttpServletResponse response)

{

    

      response.setCharacterEncoding("UTF-8");//控制服务器发送方式

       response.setHeader("content-type","text/html;charset=UTF-8");//控制浏览器打开方式

    //以上两条等价于下面这一条

     response.setContentType("text/html;charset=UTF-8");

}

利用HttpServletResponse对象实现文件下载:

public void doGet(HttpServletRequest request,HttpServletResponse response)

{

    String path=this.getServletContext().getRealPath("/downloads/当当.jpg");//获取文件在磁盘的绝对路径

        String filename=path.substring(path.lastIndexOf("\\"+1));截取文件名,注意转义反斜杠\

        response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(filename,"UTF-8));//设置头信息,对中文文件名实现转码

    

    InputStream in=new FileInputStream("path");//创建文件输入流对象,与文件建立链接

    OutputStream out=response.getOutputStream();

        try{

        int len=0;

                byte buffer[]=new byte[1024];

                while((len=in.read(buffer)>0){

            out.write(buffer,0,len);//将字节数组的内容输出到浏览器

        }

    }finally{

        if(in!=null){

            try{

            

                in.close()//关闭文件输入流;自己new的要自己关,通过系统获取的(比如本例中的out)不用自己关,服务器会自动进行相关处理

            }catch(Exception e){

                e.printStacktrace();

                        }

        }

    }

        

}

利用HttpServletRequest对象实现请求转发:

doGet(HttpServletRequest request, HttpServletResponse response)

    {

        request.getRequestDispatcher("/index.jsp").forward(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp) ;转发根目录/是该web应用

        或者通过ServletContext对象获取请求转发对象再进行转发:

                ServletContext context=this.getServletContext();

                RequestDispatcher rd=context.getRequestDispatcher("/index.jsp");//获取请求调度对象 指定目标页面

        rd.forward(request,response);//进行转发

        

    }

利用HttpServletResponse对象实现请求重定向:

doGet(HttpServletRequest request, HttpServletResponse response)

    {

        response.sendRedirect("/Lihao/index.jsp");重定向根目录/是承载该应用的服务器根目录(这里应该是webapp目录吧。。)

    }

notice:转发(当前请求的延续)算是同一个请求,从定向(一个全新的请求)则不是

       调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;
       调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

                   what's the difference between forward() and redirect() ?

down
voteaccepted
Broadly speaking, 
Redirect
 will
do an http redirection (with the header location). It means that the browser of the client will change the page. It processes to a new routing(it can also be used to go to another website重定向可以跨域) and the
actual script will end.

Whereas 
Forward
 is
internal, the browser of the client wont see any difference, you just execute a different controller.The dispatch loop allows the user to forward the execution flow to another controller/action.This is
very useful to check if the user can access to certain options, redirect users to other screens or simply reuse code. But, Keep in mind that making a “forward” is not the same as making an HTTP redirect. Although they apparently got the same result. The “forward”
doesn’t reload the current page, all the redirection occurs in a single request, while the HTTP redirect needs two requests to complete the process.

Similar analogy can be shown in JSP as well,

The 
sendRedirect(String
path)
 method of 
HttpServletResponse
 will
tell the client that it should send a request to the specified path. So the client will build a new request and submit it to the server. The client's history will be updated so the forward and back buttons will work. This method is useful for redirecting to
pages on other servers and domains.

The forward method of 
RequestDispatcher
 will
forward the 
ServletRequest
 and 
ServletResponse
that
it is passed to the path that was specified in 
getRequestDispatcher(String
path).
 The response will not be sent back to the client and so the client will not know about this change of resource on the server. This method is useful for communicating between server resources, (servlet to servlet). This method is
faster than using 
sendRedirect
 as
no network round trip to the server and back is required.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: