【温故知新】Java web 开发(二)Servlet 和 简单JSP
系列一介绍了新建一个 web 项目的基本步骤,系列二就准备介绍下基本的 jsp 和 servlet 使用。
(关于jsp的编译指令、动作指令、内置对象不在本文讨论范围之内)
1. 首先,在 pom.xml 文件中添加 jsp 和 servlet 的支持包。
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
2. 编写第一个处理请求的 servlet。
所有的 servlet 必须继承 HttpServlet 才能具备处理和响应 HTTP 请求的能力,这也是上边依赖添加的必要性。子类 servlet 只需要重写 doGet() 方法就能自定义对 GET 请求的处理,重写 doPost() 方法能处理 POST请求,其它还有 doPut()、doDelete()等方法。
如果你熟悉 HttpServlet 的相关知识,就会知道重写 service() 方法也能达到目的,因为这个才是处理请求的中枢方法,它负责处理请求,并根据请求类型分配到指定方法上去,如下图所示:

下边给出第一个 servlet 实例。
public class HelloServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
System.out.println(request.getQueryString());
String name = request.getParameter("name");
String gender = request.getParameter("gender");
PrintStream out = new PrintStream(response.getOutputStream());
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet测试</title>");
out.println("</head>");
out.println("<body>");
out.println("您的名字是:" + name + " <hr/>");
out.println("您的性别:" + gender + " <hr/>");
out.println("</body></head>");
}
}
这是一种经典的处理和相应方式,采用的是 response 对象的 输出流直接拼写页面,然后返回给客户端。还有其它的方式,比如 jsp 页面,这个后边会具体描述。
PS: servlet 的生命周期以及init()、destroy() 方法也要掌握一下。
3. 在 web.xml 中配置请求的映射
虽然 HelloServlet 以及具备了处理请求的能力,但是它具体用来处理那种样式的 URL 请求还没有配置,而这个是在 web.xml 中决定的。在 web.xml 的 web-app 元素里添加如下的代码:
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>Servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
这样子就把 HelloServlet 绑定来处理 /hello 的请求了。
4. 请求实例

5. 重要知识点
l Servlet 3.0 开始,可以使用 @WebServlet 注解来代替 web.xml 中配置请求模式的操作,可以说是很方便了。下图演示了这一点,以及重写 service() 方法。
l 事实上,Servlet 2.5 规范之后,web.xml的必要性就不复存在了,原因大概在于 注解的强势崛起吧。不过,我们在开发的时候仍习惯于保留这个 web.xml,然后同时活用注解的方式。
@WebServlet(name="worldServlet", urlPatterns = {"/world"})
public class WorldServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
System.out.println(request.getQueryString());
String world = request.getParameter("world");
PrintStream out = new PrintStream(response.getOutputStream());
out.println("<html>");
out.println("<head>");
out.println("<title>world测试</title>");
out.println("</head>");
out.println("<body>");
out.println("您的世界是:" + world + " <hr/>");
out.println("</body></head>");
}
}

l 除了在 servlet 的处理方法中直接写回输出页面之外,还可以采用 jsp 的方式响应请求。而事实上,jsp 就是一种特殊的 servlet,它由 web 容器(比如 tomcat)负责编译生成 servlet,感兴趣的可以自己查阅资料,具体来说页面跳转的方式,使用 request.forward("/process.jsp")方法。(还有重定向的方式,开发人员还是需要区分两者的,这里不提)
Servlet 代码如下所示:
@WebServlet(name = "thirdServlet", urlPatterns = {"/third"})
public class ThirdServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request.getRequestDispatcher("/WEB-INF/page/process.jsp").forward(request,response);
request.getRequestDispatcher("/outer_process.jsp").forward(request,response);
}
}
process.jsp内容如下,放置在/WEB-INF/page下,在外部也有一个相同内容(除了 title)的文件outer_process.jsp,这是为了演示他们在使用forward时的不同,因为WEB-INF下的文件无法直接在浏览器访问。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>处理页</title>
</head>
<body>
<!-- 使用 jsp 内置对象 out(javax.servlet.jsp.JspWriter) 来输出当前时间,刷新可更新时间。 -->
<%
out.println(new java.util.Date());
%>
<!-- 使用 jsp 内置对象 request 来获取参数 -->
<%
String name = request.getParameter("name");
Integer age = Integer.parseInt(request.getParameter("age"));
%>
您的名字是: <%=name%><hr/>
您的年龄是:<%=age%><hr/>
</body>
</html>




【温故知新】Java web 开发(二)Servlet 和 简单JSP的更多相关文章
- IDEA与Tomcat创建并运行Java Web项目及servlet的简单实现
创建Web项目 1. File -> New Project ,进入创建项目窗口 2.在 WEB-INF 目录下点击右键, New -> Directory ,创建 classes 和 ...
- java web开发基础实例(javabean+jsp+servlet+jdbc)
JavaBean:用于传递数据,拥有与数据相关的逻辑处理 JSP:从Model接收数据并生成HTML Servlet:接收HTTP请求并控制Model和View jdbc:用于配置环境 一.[建立数据 ...
- Java Web开发基础(2)-JSP
上一篇博我粗略的介绍了一下Servlet.粗略是由于博主也刚刚学习这部分的内容,还不是非常懂所以无法讲的非常精细.可是本着二八原则,我还是先继续学习.所以,这篇博客接着JSP的内容.由于.这两个内容关 ...
- 跟阿根一起学Java Web开发二:使用Ajax技术及XML与JSON实现输出
如今B/S结构的系统使用Ajax技术是再平常只是的了.今天我们就来探讨下在JSPGenSDF第四版中:怎样使用Ajax技术.怎样输出XML文件及JSON格式数据输出. 怎样搭建一个最基础的JSPGen ...
- web开发(二) Servlet中response、request乱码问题解决
在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6412475.html>,在此仅供学习参考之用. 一.re ...
- java web开发及Servlet常用的代码
日志 1.使用门面模式的slfj,并结合log4j,logback. 2.info.debug.error,要写清楚. 3.使用占位符,如下: log.info("用户id为: {} &qu ...
- java web 开发三剑客 -------电子书
Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知In ...
- SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。
熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...
- java web 开发入门 --- tomcat/servlet/jsp
在做java web 开发时,要先安装tomcat.它是一个web服务器,也叫web容器,我们把写好的jsp, html页面放到它里面,然后启动它,就可以用浏览器访问这些页面,地址栏中输入localh ...
- 【Java Web开发学习】Spring MVC添加自定义Servlet、Filter、Listener
[Java Web开发学习]Spring MVC添加自定义Servlet.Filter.Listener 转载:https://www.cnblogs.com/yangchongxing/p/9968 ...
随机推荐
- SharpDX初学者教程第3部分:初始化DirectX
原文 http://www.johanfalk.eu/blog/sharpdx-beginners-tutorial-part-3-initializing-directx 在这部分中,我们将初始化D ...
- ROS 设置串口USB软连接
原创:未经同意,请勿转载 我们在windows 通过USB连接串口,在设备串口中可以观测到COM0或者COMx.当我们插入不同的USB口时会显示不同的COM. 在UBUNTU下,ROS下接收串口信息时 ...
- Laravel中利用队列发送邮件的方法示例
https://www.jb51.net/article/121647.htm 本文主要给大家介绍了关于Laravel中队列发送邮件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的 ...
- hdu 3329 The Flood (Flood Fill + MFSet)
Problem - 3329 用pfs,将淹没时间调整回来,然后用并查集,时间倒序插入点. 代码如下: #include <iostream> #include <algorithm ...
- Python基础之(三)----PyGame安装步骤
http://blog.csdn.net/qq_33166080/article/details/68928563 如果你已经有一定的编程经验,那么学习一门新语言最快的方式就是拿着一个比较中型的项目, ...
- LA 4973 Ardenia (3D Geometry + Simulation)
ACM-ICPC Live Archive 三维几何,题意是要求求出两条空间线段的距离.题目难度在于要求用有理数的形式输出,这就要求写一个有理数类了. 开始的时候写出来的有理数类就各种疯狂乱套,TLE ...
- oracle用索引提高效率
索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最 ...
- apply、call、bind方法调用
---恢复内容开始--- 首先这三个方法的作用都是用来改变this的值,而this的值一般有几种情况. 1.函数作为一个对象的一个方法来调用,此时this的值指向对象. var a={ v:0; f: ...
- Python--day21--复习
序列化模块总结: jison格式化输出: Serialize obj to a JSON formatted str.(字符串表示的json对象) Skipkeys:默认值是False,如果dict的 ...
- Codeforces Round #170 (Div. 1 + Div. 2)
A. Circle Line 考虑环上的最短距离. B. New Problem \(n\) 个串建后缀自动机. 找的时候bfs一下即可. C. Learning Languages 并查集维护可以沟 ...