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

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

一、Servlet

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

比如:

  1. @WebServlet(name="firstServlet",urlPatterns={"/firstServlet"})
  2. public class FirstServlet extends HttpServlet {
  3. /**
  4. * Constructor of the object.
  5. */
  6. public FirstServlet() {
  7. super();
  8. }
  9. /**
  10. * Destruction of the servlet. <br>
  11. */
  12. public void destroy() {
  13. super.destroy(); // Just puts "destroy" string in log
  14. // Put your code here
  15. }
  16. /**
  17. * The doGet method of the servlet. <br>
  18. *
  19. * This method is called when a form has its tag value method equals to get.
  20. *
  21. * @param request the request send by the client to the server
  22. * @param response the response send by the server to the client
  23. * @throws ServletException if an error occurred
  24. * @throws IOException if an error occurred
  25. */
  26. public void doGet(HttpServletRequest request, HttpServletResponse response)
  27. throws ServletException, IOException {
  28. response.setContentType("text/html");
  29. PrintWriter out = response.getWriter();
  30. out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
  31. out.println("<HTML>");
  32. out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
  33. out.println("  <BODY>");
  34. out.print("    This is ");
  35. out.print(this.getClass());
  36. out.println(", using the GET method");
  37. out.println("  </BODY>");
  38. out.println("</HTML>");
  39. out.flush();
  40. out.close();
  41. }
  42. /**
  43. * The doPost method of the servlet. <br>
  44. *
  45. * This method is called when a form has its tag value method equals to post.
  46. *
  47. * @param request the request send by the client to the server
  48. * @param response the response send by the server to the client
  49. * @throws ServletException if an error occurred
  50. * @throws IOException if an error occurred
  51. */
  52. public void doPost(HttpServletRequest request, HttpServletResponse response)
  53. throws ServletException, IOException {
  54. response.setContentType("text/html");
  55. PrintWriter out = response.getWriter();
  56. out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
  57. out.println("<HTML>");
  58. out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
  59. out.println("  <BODY>");
  60. out.print("    This is ");
  61. out.print(this.getClass());
  62. out.println(", using the POST method");
  63. out.println("  </BODY>");
  64. out.println("</HTML>");
  65. out.flush();
  66. out.close();
  67. }
  68. /**
  69. * Initialization of the servlet. <br>
  70. *
  71. * @throws ServletException if an error occurs
  72. */
  73. public void init() throws ServletException {
  74. // Put your code here
  75. }
  76. }

这段代码是在myeclipse工具当中创建servlet时自动生成的,可以看到我们新建的FirstServlet类继承自HttpServlet。而且又实现了里面的doGet(Get请求时调用的方法)、doPost(Post请求时调用的方法)、init(初始化对象)、destroy(销毁对象)。值得注意的是我们采用了Annotation的方式进行了修饰,即:@WebServlet(name="firstServlet",urlPatterns={"/firstServlet"})。这是servlet3.0开始推荐的,以前采用的方式是在web.xml里面添加servlet和servlet-mapping配置。比如:

  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名。

  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完整代码:

  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. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. <title>My JSP 'MyJsp.jsp' starting page</title>
  12. <meta http-equiv="pragma" content="no-cache">
  13. <meta http-equiv="cache-control" content="no-cache">
  14. <meta http-equiv="expires" content="0">
  15. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  16. <meta http-equiv="description" content="This is my page">
  17. <!--
  18. <link rel="stylesheet" type="text/css" href="styles.css">
  19. -->
  20. </head>
  21. <body>
  22. <%
  23. Class.forName("com.mysql.jdbc.Driver");//加载驱动
  24. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root", "123456");//建立连接
  25. Statement stmt = conn.createStatement();//创建执行者
  26. ResultSet rs = stmt.executeQuery("select * from city limit 0,10");//返回结果集(游标)
  27. %>
  28. <table cellpadding="0" cellspacing="0" border="1" width="500" >
  29. <%
  30. while (rs.next()) {
  31. %>
  32. <tr>
  33. <td><%=rs.getString(1) %></td>
  34. <td><%=rs.getString(2) %></td>
  35. </tr>
  36. <%
  37. }
  38. %>
  39. </table>
  40. </body>
  41. </html>

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

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

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

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

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

Java Web开发之Servlet、JSP基础的更多相关文章

  1. Java Web开发之Servlet获取ckeditor内容

    js: <!-- ckeditor插件 --> <script type="text/javascript" src="js/ckeditor/cked ...

  2. web开发之Servlet 一

    因为最近在研究公司一套新的框架,发现这套框架的底层是对Struts2,Spring 封装后的WEB应用框架,而我发现如果仅仅是利用这个框架开发,确实很容易快速上手,做业务来说是没有问题的,但我觉得如果 ...

  3. web开发之Servlet 三

    昨天我们学习了Servlet的运行过程和生命周期,那么今天我们学习下Servlet中非常重要的两个类:ServletConfig  ServletContext 我们可以看到,与顶层Servlet主动 ...

  4. Java Web开发之Spring | SpringMvc | Mybatis | Hibernate整合、配置、使用

    1.Spring与Mybatis整合 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web ...

  5. Web开发之Servlet

    当一个请求到达服务端,服务器怎么处理? 当一个请求到达服务端时,由服务端的引擎来进行分析.它根据工程名找到工程, 然后拿到URL的资源地址和web.XML文件的所有的进行对比,和哪一个对比上就找到了具 ...

  6. web开发之Servlet 二

    在上一篇文章中,我们演示也证明了Servlet 是一种动态web资源开发的技术,即我可以在浏览器中输入URL,然后就可以在浏览器中看到我们编写的Servlet资源. 那当我们在浏览器上一起一个HTTP ...

  7. java web 开发之 office(excel、doc等)文件转pdf

    一.开发工具:office 16.jacob-1.18-M2.jboss 1.6 二.开发配置: 1.解压缩---> 2.配置jacob: A C:\Windows\System32 jacob ...

  8. Web开发之Tomcat&Servlet

    <!doctype html>01 - JavaEE - Tomcat&Servlet figure:first-child { margin-top: -20px; } #wri ...

  9. springMVC: java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config

    springMVC开发web的时候,报错:java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config 原因:未引入jstl ...

随机推荐

  1. XML文件

    XML 指可扩展标记语言(eXtensible Markup Language) XML 被设计用来传输和存储数据. 什么是 XML? XML 指可扩展标记语言 XML 是一种标记语言,非常类似 HT ...

  2. hdu 5465 Clarke and puzzle 二维线段树

    Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

  3. java并行调度框架封装及演示样例

    參考资料:  阿里巴巴开源项目 CobarClient  源代码实现. 分享作者:闫建忠 分享时间:2014年5月7日 ---------------------------------------- ...

  4. Android在线更新 远程安装程序

    原文:http://blog.csdn.net/jasper_success/article/details/7984065 第一步:使用java.net的URLConnection对象来创建连接 第 ...

  5. Google maps API开发(一)(转)

    一.加载Google maps API <script type="text/javascript" src="http://ditu.google.com/map ...

  6. Redis 和 Memcached 的区别

    来源:标点符 链接:http://www.biaodianfu.com/redis-vs-memcached.html Redis 的作者 Salvatore Sanfilippo 曾经对这两种基于内 ...

  7. CodeMachine Debugger Extension DLL

    http://www.codemachine.com/downloads.html http://www.codemachine.com/tool_cmkd.html#stack

  8. 【转】cocos2d-x 2.0版本 自适应屏幕分辨率

    http://codingnow.cn/cocos2d-x/975.html 我使用的版本是cocos2d-2.0-x-2.0.4,cocos2dx-2.0版本对多分辨率适配提供了很好的支持,使用起来 ...

  9. sleep() wait() yield() join()用法与区别

    1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”.不推荐使用. sleep()使当前线程进入阻塞状态,在指定时间内不会执行. 2.wait()方法 在其他线程调用 ...

  10. 分布式算法(一致性Hash算法)

    一.分布式算法 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法( ...