Java Web开发之Servlet、JSP基础
有好多年不搞Java Web开发了,这几天正好国庆放假,放松之余也有兴趣回头看看Java Web开发技术的基础。
我们都知道,Servlet是Java Web开发的重要基础,但是由于Servlet开发相对繁琐,代码量庞大而且不易维护,美工无法参与界面设计开发等不足,于是就诞生了jsp。jsp是对servlet开发模型的重要升级。有了jsp,Java Web开发技术才真正被广泛使用。
一、Servlet
在Java Web开发当中,新建一个类继承(派生)自HttpServlet类即可创建一个Servlet。
比如:
- @WebServlet(name="firstServlet",urlPatterns={"/firstServlet"})
- public class FirstServlet extends HttpServlet {
- /**
- * Constructor of the object.
- */
- public FirstServlet() {
- super();
- }
- /**
- * Destruction of the servlet. <br>
- */
- public void destroy() {
- super.destroy(); // Just puts "destroy" string in log
- // Put your code here
- }
- /**
- * The doGet method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to get.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html");
- PrintWriter out = response.getWriter();
- out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
- out.println("<HTML>");
- out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
- out.println(" <BODY>");
- out.print(" This is ");
- out.print(this.getClass());
- out.println(", using the GET method");
- out.println(" </BODY>");
- out.println("</HTML>");
- out.flush();
- out.close();
- }
- /**
- * The doPost method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to post.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html");
- PrintWriter out = response.getWriter();
- out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
- out.println("<HTML>");
- out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
- out.println(" <BODY>");
- out.print(" This is ");
- out.print(this.getClass());
- out.println(", using the POST method");
- out.println(" </BODY>");
- out.println("</HTML>");
- out.flush();
- out.close();
- }
- /**
- * Initialization of the servlet. <br>
- *
- * @throws ServletException if an error occurs
- */
- public void init() throws ServletException {
- // Put your code here
- }
- }
这段代码是在myeclipse工具当中创建servlet时自动生成的,可以看到我们新建的FirstServlet类继承自HttpServlet。而且又实现了里面的doGet(Get请求时调用的方法)、doPost(Post请求时调用的方法)、init(初始化对象)、destroy(销毁对象)。值得注意的是我们采用了Annotation的方式进行了修饰,即:@WebServlet(name="firstServlet",urlPatterns={"/firstServlet"})。这是servlet3.0开始推荐的,以前采用的方式是在web.xml里面添加servlet和servlet-mapping配置。比如:
- <servlet>
- <servlet-name>firstServlet</servlet-name>
- <servlet-class>包名.FirstServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>firstServlet</servlet-name>
- <url-pattern>/firstServlet</url-pattern>
- </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名。
- <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完整代码:
- <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ page import="java.sql.*" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>My JSP 'MyJsp.jsp' starting page</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <body>
- <%
- Class.forName("com.mysql.jdbc.Driver");//加载驱动
- Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root", "123456");//建立连接
- Statement stmt = conn.createStatement();//创建执行者
- ResultSet rs = stmt.executeQuery("select * from city limit 0,10");//返回结果集(游标)
- %>
- <table cellpadding="0" cellspacing="0" border="1" width="500" >
- <%
- while (rs.next()) {
- %>
- <tr>
- <td><%=rs.getString(1) %></td>
- <td><%=rs.getString(2) %></td>
- </tr>
- <%
- }
- %>
- </table>
- </body>
- </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基础的更多相关文章
- Java Web开发之Servlet获取ckeditor内容
js: <!-- ckeditor插件 --> <script type="text/javascript" src="js/ckeditor/cked ...
- web开发之Servlet 一
因为最近在研究公司一套新的框架,发现这套框架的底层是对Struts2,Spring 封装后的WEB应用框架,而我发现如果仅仅是利用这个框架开发,确实很容易快速上手,做业务来说是没有问题的,但我觉得如果 ...
- web开发之Servlet 三
昨天我们学习了Servlet的运行过程和生命周期,那么今天我们学习下Servlet中非常重要的两个类:ServletConfig ServletContext 我们可以看到,与顶层Servlet主动 ...
- Java Web开发之Spring | SpringMvc | Mybatis | Hibernate整合、配置、使用
1.Spring与Mybatis整合 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web ...
- Web开发之Servlet
当一个请求到达服务端,服务器怎么处理? 当一个请求到达服务端时,由服务端的引擎来进行分析.它根据工程名找到工程, 然后拿到URL的资源地址和web.XML文件的所有的进行对比,和哪一个对比上就找到了具 ...
- web开发之Servlet 二
在上一篇文章中,我们演示也证明了Servlet 是一种动态web资源开发的技术,即我可以在浏览器中输入URL,然后就可以在浏览器中看到我们编写的Servlet资源. 那当我们在浏览器上一起一个HTTP ...
- java web 开发之 office(excel、doc等)文件转pdf
一.开发工具:office 16.jacob-1.18-M2.jboss 1.6 二.开发配置: 1.解压缩---> 2.配置jacob: A C:\Windows\System32 jacob ...
- Web开发之Tomcat&Servlet
<!doctype html>01 - JavaEE - Tomcat&Servlet figure:first-child { margin-top: -20px; } #wri ...
- springMVC: java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
springMVC开发web的时候,报错:java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config 原因:未引入jstl ...
随机推荐
- XML文件
XML 指可扩展标记语言(eXtensible Markup Language) XML 被设计用来传输和存储数据. 什么是 XML? XML 指可扩展标记语言 XML 是一种标记语言,非常类似 HT ...
- hdu 5465 Clarke and puzzle 二维线段树
Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
- java并行调度框架封装及演示样例
參考资料: 阿里巴巴开源项目 CobarClient 源代码实现. 分享作者:闫建忠 分享时间:2014年5月7日 ---------------------------------------- ...
- Android在线更新 远程安装程序
原文:http://blog.csdn.net/jasper_success/article/details/7984065 第一步:使用java.net的URLConnection对象来创建连接 第 ...
- Google maps API开发(一)(转)
一.加载Google maps API <script type="text/javascript" src="http://ditu.google.com/map ...
- Redis 和 Memcached 的区别
来源:标点符 链接:http://www.biaodianfu.com/redis-vs-memcached.html Redis 的作者 Salvatore Sanfilippo 曾经对这两种基于内 ...
- CodeMachine Debugger Extension DLL
http://www.codemachine.com/downloads.html http://www.codemachine.com/tool_cmkd.html#stack
- 【转】cocos2d-x 2.0版本 自适应屏幕分辨率
http://codingnow.cn/cocos2d-x/975.html 我使用的版本是cocos2d-2.0-x-2.0.4,cocos2dx-2.0版本对多分辨率适配提供了很好的支持,使用起来 ...
- sleep() wait() yield() join()用法与区别
1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”.不推荐使用. sleep()使当前线程进入阻塞状态,在指定时间内不会执行. 2.wait()方法 在其他线程调用 ...
- 分布式算法(一致性Hash算法)
一.分布式算法 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法( ...