您的位置:首页 > 编程语言 > Java开发

javaWeb开发

2016-09-08 17:33 387 查看
转载: http://www.cnblogs.com/xdp-gacl/p/3729033.html

二、Servlet的运行过程

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:

  ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。

  ②装载并创建该Servlet的一个实例对象。 

  ③调用Servlet实例对象的init()方法。

  ④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。

  ⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。 


三、Servlet调用图

 



四、在Eclipse中开发Servlet

  在eclipse中新建一个web project工程,eclipse会自动创建下图所示目录结构:

 


4.1、Servlet接口实现类

  Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。

  HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。

  HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。

4.2代码:

package HttpTest;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.text.MessageFormat;

import java.util.Properties;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.sun.xml.internal.ws.client.RequestContext;

public class ServletDemo002 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//1. 获取整个web的初始化参数
/* String contextInit = context.getInitParameter("url");
String nameInit = context.getInitParameter("name");
response.getWriter().println("contextInit:" + contextInit + "nameInit:" + nameInit);*/
//2.用servletcontent 实现请求转发
/*String  data="<h1><font color='red'>abbdhd</h1>" ;
response.getOutputStream().write(data.getBytes());
ServletContext contexts=this.getServletContext();   //获取servlet对象
RequestDispatcher rd=context.getRequestDispatcher("/HttpTest/ServletTest001");  //获取请求转发对象
rd.forward(request, response); //实现请请求转发*/ 

//3.使用servletContext读取资源文件

/* response.setContentType("text/html;charset=UTF-8");  //控制浏览器使用utf-8解读,以防出现乱码
response.setHeader("content-type","text/html;charset=UTF-8");
readSrcDirPropCfgFile(response);//读取src目录下的的db1.properties配置文件

*/   
//4.使用类装载器读取资源文件,注意:文件不能过大,否则会导致内存溢出
/*response.setHeader("content-type","text/html;charset=UTF-8");
test1(response);*/
//5.在客户端缓存Servlet输出
//对于不经常访问的数据,servlet为其设置合理的缓存时间,以避免浏览器频繁的发送请求,
String  data="今天是16年的中秋节" ;
response.setDateHeader("expires", System.currentTimeMillis()+24*3600*1000);
response.getOutputStream().write(data.getBytes());

}

private void readSrcDirPropCfgFile(HttpServletResponse response){
//获取文件的绝对路径
//String path=this.getServletContext().getRealPath("/WEB-INF/classes/db1.properties");
InputStream in =null;
try {
// in = new FileInputStream(path);
in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db1.properties");
//in=this.getServletContext().getResourceAsStream("/db1.properties");  //“/”代表根目录
Properties prop=new Properties();
prop.load(in);
String driver=prop.getProperty("driver");
String url=prop.getProperty("url");
String username=prop.getProperty("username");
String password=prop.getProperty("password");
response.getWriter().println("读取src目录下的db1文件");
response.getWriter().println(MessageFormat.format("driver={0},url={1},username={2},password={3}", driver,url, username, password));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
private void test1(HttpServletResponse response) throws IOException{
//获取到装载当前类的类装载器
ClassLoader  loader=ServletDemo002.class.getClassLoader();
//用类装载器读取src目录下的db1文件
InputStream is=loader.getResourceAsStream("db1.properties");
Properties p=new Properties();
p.load(is);
String driver=p.getProperty("driver");
String url=p.getProperty("url");
String username=p.getProperty("username");
String password=p.getProperty("username");
response.getWriter().println("通过类加载读取配置文件:");
response.getWriter().println(MessageFormat.format("driver={0},url={1},username={2},password={3}", driver,url, username, password));

}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}

}

注:想请求重定向,如登录成功后跳转到另一个页面 使用:

【1】response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp"); 但是这个地址不够灵活,所以可以使用:

response.sendRedirect(request.getContextPath()+"index.jsp"); //替代了项目名称

获取服务端文件路径:this.getServletContext().getrRealPath("/download/1.JPG")

一般最好在路径前加上“/“,对于服务端代表当前web工程,对于客户端则代表webapps目录

【2】在服务端forward到其他页面:
客户端请求某个web资源,服务器跳转到另外一个web资源,这个forward也是给服务器用的,this.getServletContext().getRequestDispatcher("/index.jsp").forward(request,
response);
【3】使用include指令或者<jsp:include>标签引入页面

<%@include file="/jspfragments/head.jspf" %> 或者
<jsp:include page="/jspfragments/demo.jsp" />
【4】

<a
href="${pageContext.request.contextPath}/index.jsp">跳转到首页</a>
这这种是给浏览器用的路径

【5】在form表单中的使用:

1 <form action="${pageContext.request.contextPath}/servlet/CheckServlet" method="post">
2          <input type="submit" value="提交">
3 </form>

${pageContext.request.contextPath}等同于request.getContextPath()来获取项目的绝对路径

等同与

<form action="<%=request.getContextPath()%>/servlet/CheckServlet" method="post">


2          <input type="submit" value="提交">
3 </form>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: