javaWeb开发

转载: 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调用图

 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>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值