Java Web开发之Servlet、JSP基础

转载自大神http://blog.csdn.net/chinacsharper/article/details/39777643


有好多年不搞Java Web开发了,这几天正好国庆放假,放松之余也有兴趣回头看看Java Web开发技术的基础。

我们都知道,Servlet是Java Web开发的重要基础,但是由于Servlet开发相对繁琐,代码量庞大而且不易维护,美工无法参与界面设计开发等不足,于是就诞生了jsp。jsp是对servlet开发模型的重要升级。有了jsp,Java Web开发技术才真正被广泛使用。

一、Servlet

在Java Web开发当中,新建一个类继承(派生)自HttpServlet类即可创建一个Servlet。

比如:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @WebServlet(name="firstServlet",urlPatterns={"/firstServlet"})  
  2. public class FirstServlet extends HttpServlet {  
  3.   
  4.     /** 
  5.      * Constructor of the object. 
  6.      */  
  7.     public FirstServlet() {  
  8.         super();  
  9.     }  
  10.   
  11.     /** 
  12.      * Destruction of the servlet. <br> 
  13.      */  
  14.     public void destroy() {  
  15.         super.destroy(); // Just puts "destroy" string in log  
  16.         // Put your code here  
  17.     }  
  18.   
  19.     /** 
  20.      * The doGet method of the servlet. <br> 
  21.      * 
  22.      * This method is called when a form has its tag value method equals to get. 
  23.      *  
  24.      * @param request the request send by the client to the server 
  25.      * @param response the response send by the server to the client 
  26.      * @throws ServletException if an error occurred 
  27.      * @throws IOException if an error occurred 
  28.      */  
  29.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  30.             throws ServletException, IOException {  
  31.   
  32.         response.setContentType("text/html");  
  33.         PrintWriter out = response.getWriter();  
  34.         out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");  
  35.         out.println("<HTML>");  
  36.         out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");  
  37.         out.println("  <BODY>");  
  38.         out.print("    This is ");  
  39.         out.print(this.getClass());  
  40.         out.println(", using the GET method");  
  41.         out.println("  </BODY>");  
  42.         out.println("</HTML>");  
  43.         out.flush();  
  44.         out.close();  
  45.     }  
  46.   
  47.     /** 
  48.      * The doPost method of the servlet. <br> 
  49.      * 
  50.      * This method is called when a form has its tag value method equals to post. 
  51.      *  
  52.      * @param request the request send by the client to the server 
  53.      * @param response the response send by the server to the client 
  54.      * @throws ServletException if an error occurred 
  55.      * @throws IOException if an error occurred 
  56.      */  
  57.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  58.             throws ServletException, IOException {  
  59.   
  60.         response.setContentType("text/html");  
  61.         PrintWriter out = response.getWriter();  
  62.         out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");  
  63.         out.println("<HTML>");  
  64.         out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");  
  65.         out.println("  <BODY>");  
  66.         out.print("    This is ");  
  67.         out.print(this.getClass());  
  68.         out.println(", using the POST method");  
  69.         out.println("  </BODY>");  
  70.         out.println("</HTML>");  
  71.         out.flush();  
  72.         out.close();  
  73.     }  
  74.   
  75.     /** 
  76.      * Initialization of the servlet. <br> 
  77.      * 
  78.      * @throws ServletException if an error occurs 
  79.      */  
  80.     public void init() throws ServletException {  
  81.         // Put your code here  
  82.     }  
  83.   
  84. }  
这段代码是在myeclipse工具当中创建servlet时自动生成的,可以看到我们新建的FirstServlet类继承自HttpServlet。而且又实现了里面的doGet(Get请求时调用的方法)、doPost(Post请求时调用的方法)、init(初始化对象)、destroy(销毁对象)。值得注意的是我们采用了Annotation的方式进行了修饰,即:@WebServlet(name="firstServlet",urlPatterns={"/firstServlet"})。这是servlet3.0开始推荐的,以前采用的方式是在web.xml里面添加servlet和servlet-mapping配置。比如:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <servlet>  
  2.     <servlet-name>firstServlet</servlet-name>  
  3.     <servlet-class>包名.FirstServlet</servlet-class>  
  4. </servlet>  
  5. <servlet-mapping>  
  6.     <servlet-name>firstServlet</servlet-name>  
  7.     <url-pattern>/firstServlet</url-pattern>  
  8. </servlet-mapping>  

上面的配置有几点需要说明:

1、servlet里面的servlet-class节点需要填写servlet类的完整名称(包名.类名)

2、servlet-mapping下的servlet-name节点的名称要与servlet下的servlet-name节点的名称一致,才能找到。

3、url-pattern下的url要加"/"

启动tomcat,在ie中输入localhost:8080/工程名/firstServet,即可浏览该页面(Get请求)。8080端口是tomcat默认设置的端口号,可以在tomcat/conf/下面的server.xml文件中修改端口号。比如我们修改了默认端口号为8088,重新启动tomcat(加载xml)以后,访问的url即为:localhost:8088/工程名/servlet映射的urlpattern名。

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <Connector port="8088" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />  
最后需要说明的是,如果我们在servlet里面修改了代码,比如重新输出了一段html表格,要重新编译、部署到tomcat web容器运行,不像jsp是即时编译的。

可以看到servlet里面都是一行一行输出内容(out.println方法),所以现在基本上不会采用纯servlet开发Java Web项目,而是让其作为MVC的C(Controller,控制器)来使用。

二、jsp

正是由于纯servlet开发Java Web应用非常繁琐,而且美工和程序员无法很好的合作,jsp应运而生。jsp通过页面嵌入代码、标签库(比如JSTL,Java标准标签库)等手段,可以直接在页面中混入Java代码,从而简化开发。但是jsp的本质还是servlet,我们可以用文本编辑器(比如:editplus、notepad++)打开tomcat/work目录下的工程目录里面的classes文件就可以看到,实际上jsp还是被编译生成了servlet类文件(一个jsp对应生成一个servlet)。里面也有init、destroy、service(这个与之前的Get、Post、Put、Delete请求不同)等方法。

下面先演示一段从MySQL数据库中通过JDBC读取数据显示在页面上的功能,让读者快速上手jsp。

开发环境:

1、MySQL5.7

2、MyEclipse 2014、JDK7.0

MySQL安装后自带了一个MySQL Workbench工具,可以利用它新建数据库。


点击OK,出现如下界面。


输入密码即可登录到工作台主界面。


里面有默认的world数据库,可以在里面对Tables(表)、Views(视图)、Stored Procedures(存储过程)、Functions(函数)等进行相关操作。

当然你也可以在MySQL控制台用命令行对数据库进行操作。


我们就使用MySQL里面自带的world数据库,查询里面的city这张表,把数据显示出来(由于数据量比较大,只取前10条)。

先在MySQL的工具里面用SQL查询一下。


SQL语句测试通过,我们就可以在jsp页面中直接使用了。

MyJsp.jsp完整代码:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%@ page import="java.sql.*" %>  
  3. <%  
  4. String path = request.getContextPath();  
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  6. %>  
  7.   
  8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  9. <html>  
  10.   <head>  
  11.     <base href="<%=basePath%>">  
  12.       
  13.     <title>My JSP 'MyJsp.jsp' starting page</title>  
  14.       
  15.     <meta http-equiv="pragma" content="no-cache">  
  16.     <meta http-equiv="cache-control" content="no-cache">  
  17.     <meta http-equiv="expires" content="0">      
  18.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  19.     <meta http-equiv="description" content="This is my page">  
  20.     <!-- 
  21.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  22.     -->  
  23.   
  24.   </head>  
  25.     
  26.   <body>  
  27.     <%  
  28.         Class.forName("com.mysql.jdbc.Driver");//加载驱动  
  29.         Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root", "123456");//建立连接  
  30.         Statement stmt = conn.createStatement();//创建执行者  
  31.         ResultSet rs = stmt.executeQuery("select * from city limit 0,10");//返回结果集(游标)  
  32.     %>  
  33.   
  34.     <table cellpadding="0" cellspacing="0" border="1" width="500" >  
  35.         <%  
  36.             while (rs.next()) {  
  37.         %>  
  38.             <tr>  
  39.                 <td><%=rs.getString(1) %></td>  
  40.                 <td><%=rs.getString(2) %></td>  
  41.             </tr>  
  42.         <%  
  43.             }  
  44.         %>  
  45.     </table>  
  46.   </body>  
  47. </html>  

可以看到,直接在jsp页面中嵌入了Java代码。由于我们使用的是JDBC查询的MySQL数据库,所以我们需要mysql-connector-java-5.1.9.jar这个Jar包作为驱动,直接放到该Web工程的WEB-INF/lib目录下即可。

在浏览器中显示的结果如下:


如我们所愿,显示出了前10条数据。

其实对比一下上面的页面代码,你会发现这种页面嵌入代码的方式非常熟悉。在ASP、ASP.NET开发中都可以使用这种嵌入后台代码的方式进行开发,所以基本上开发思想都可以互相套用。

由于篇幅原因,这篇博客就先到这里,下篇博客重点讲述jsp开发中的种种细节。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值