首页 > 其他 > 详细

Servlet基础

时间:2014-07-29 13:20:39      阅读:410      评论:0      收藏:0      [点我收藏+]

  首先Servlet的命名源于Server+Applet,它就是一个继承了HttpServlet类的一个普通的java类。

  都知道它的作用类似于ASP.NET中的HttpHandler(一般处理程序),不错,在.NET中其实用HTML页+HttpHandler+DAL来开发网站,效率是最高的,而且完全可以实现。因为这样就抛掉了我们传统开发所用的大量服务器控件,用纯的HTML控件开发不需要服务器的解析,当然效率很高。客户端请求发送至HttpHandler,由它与DAL层打交道,获取数据,然后向客户端渲染所需的HTML页。

  在java中,早期的网站开发就是用相似的开发模式。即用HTML页+Servlet+DAO来开发网站。Servlet的作用与上面的HttpHandler几乎完全相同。HttpHandler是继承自IHttpHandler的普通类;Servlet是继承自HttpServlet的普通类。它门都通过继承与Http发生了关系,它们的作用都是接收客户端请求--- >拿数据--- >渲染页面。

  由上这种开发模式中,可以看出HttpHandler与Servlet都充当了网站三层架构(表现出、业务层、数据层)中的业务层,因为这种开发是有弊端的,所以都没有流行。弊端就是需要最终渲染客户端页面是需要一句一句输出的,这样,编写和修改HTML都会非常不方便。例如:

【用户登录】的HttpHandler:

  

    public class TestHandler : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
            //取出请求中的参数username和password
            string userName = context.Request["username"];
            string passWord = context.Request.QueryString["password"];
            //定义画表单page的字符串
            string html = "<html><head></head><body><form action='TestHandler2.ashx'>用户名:<input type='text' name='username' value='{username}'/><br/>密 码:<input type='password' name='password' value='{password}' /> <input type='submit' value='登录'/></form><p>{msg}</p></body></html>";
            //判断,如果username和password为空则将字符串html中的占位符{username}、{password}、{msg}分别替换为空,然后将字符串返回给浏览器进行解析
            if (string.IsNullOrEmpty(userName) && string.IsNullOrEmpty(passWord))
            {
                string code = html.Replace("{username}", "");
                code = code.Replace("{password}", "");
                code = code.Replace("{msg}", "");
                //将字符串返回给浏览器
                context.Response.Write(code);
            }
            else
            {
                //如果用户名、密码都正确则将字符串“恭喜,登录成功!”返回给浏览器
                if (userName == "admin" && passWord == "admin")
                {
                    context.Response.Write("恭喜,登录成功!");
                }
                //如果用户名或密码填写不正确,则将填写的信息填充标签的值,并将占位符{msg}替换为“用户名或密码有错误”进行提示
                else
                {
                    string code = html.Replace("{username}", userName);
                    code = code.Replace("{password}", passWord);
                    code = code.Replace("{msg}", "用户名或密码有错误!");
                    context.Response.Write(code);
                }
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

从上面的html字符串就可以看出它的弊端。

Servlet非常类似,下面看Servlet的使用:

 

生命周期

 

  首先看Servlet的生命周期,它是由容器Tomcat来管理的,当客户端第一次请求Servlet时,Tomcat会new一个Servlet的对象,并且之后的请求都不会再new,所以Servlet是单实例、多线程的,因此它不是线程安全的。示例图:

  bubuko.com,布布扣


调用

 

  客户端请求Servlet时,我们通过web.xml文件来为两者做匹配。Servlet是服务器端资源,哪个客户端请求哪个Servlet不再是写死的,而是通过配置文件来灵活配置。实例如下:


客户端:(login.html)

<html>
	<head>
		<title>登录</title>
	</head>
	<body>
		<form action="exam/loginServlet" method="post">
			用户:<input type="text" name="username"><br>
			密码:<input type="password" name="password"><br>
			<input type="submit" value="登录">
		</form>
	</body>
</html>

配置文件(web.xml)

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
	<servlet>
		<servlet-name>MyServlet</servlet-name>
		<servlet-class>LoginServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>MyServlet</servlet-name>
		<url-pattern>/exam/loginServlet</url-pattern>
	</servlet-mapping>
</web-app>

服务器端:(LoginServlet.java)

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class LoginServlet extends HttpServlet {
	
	public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
              throws ServletException,
                     IOException {
        String username = request.getParameter("username");   
        String password = request.getParameter("password");          	
        
        //System.out.println("username=" + username);
        //System.out.println("password=" + password);
        
        response.setContentType("text/html;charset=GB18030");
        
        response.getWriter().println("<html>");
        response.getWriter().println("<head>");	
        response.getWriter().println("<title>登录信息</title>");	
        response.getWriter().println("</head>");	
        response.getWriter().println("<body>");	
        response.getWriter().println("欢迎【" + username + "】用户登录成功!!!");	
        response.getWriter().println("</body>");	
        response.getWriter().println("</html>");
    }                 	                    
}

调用流程

 

  bubuko.com,布布扣

  上面的顺序图着重体现如何根据客户端请求,来找到相应的Servlet,并实例化,下面再用一张图,着重体现Http相关对象的创建与传递过程:

  bubuko.com,布布扣


总结

 

  Servlet继承自HttpServlet类,核心实现它的Service(doGet、doPost)方法,该方法通过由Tomcat容器创建的HttpRequest、HttpResponse两个对象作为参数来传递Http状态。从而实现客户-服务器的通信。所有Servlet的内容架构是固定的,只是不同的Servlet的实现不同,所以它体现了“模板“的思想。之前讲HttpHandler的模板引擎有类似的思想。

Servlet基础,布布扣,bubuko.com

Servlet基础

原文:http://blog.csdn.net/wang379275614/article/details/38239953

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!