第二章 编写与设置Servlet
- 2.1 第一个Servlet
package cc.openhome; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; /**
* Created by Administrator on 2016/4/6.
*/
@WebServlet("/hello.view")
//继承HttpServlet
public class HelloServlet extends HttpServlet {
//重新定义doGet()
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应内容类型
resp.setContentType("text/html;charset=UTF-8");
//取得响应输出对象
PrintWriter out = resp.getWriter();
//取得“请求参数”
String name = req.getParameter("name"); out.println("<html>");
out.println("<head>");
out.println("<title>Hello Servlet</title>");
out.println("</head>");
out.println("<body>");
//输出Hello
out.println("<h1>Hello! " + name + " !</h1>");
out.println("</body>");
out.println("</html>"); out.close();
}
}
- 2.2 在HelloServlet之后
关于HttpServlet
使用@WebServlet
@WebServlet("/hello.view")
//继承HttpServlet
public class HelloServlet extends HttpServlet {
只要在Servlet上设置@WebServlet标注,容器就会自动读取当中的信息,上面的@WebServlet告诉容器,如果请求的URL是"/hello.view",则由HelloServlet的实例提供服务。
@WebServlet(
name="Hello",
urlPatterns={"/hello.view"},
//启动程序后就要初始化Servlet,数字表示初始化顺序
laodOnStartuo=1
)
public class HelloServlet extends HttpServlet {}
使用web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<!--注册的Servlet名称-->
<servlet-name>HelloServlet</servlet-name>
<!--设置的实体类名称-->
<servlet-class>cc.openhome.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<!--设置的逻辑名称,若有客户端请求/helloUser.view,则由这个Servlet来处理-->
<url-pattern>helloUser.view</url-pattern>
</servlet-mapping>
</web-app>
文件组织与部署
WEB-INF:这个目录名称是固定的,而且一定是位于应用程序根目录下。放置在WEB-INF中的文件或目录,对外界来说是封闭的,也就是客户端无法使用HTTP的任何方式直接访问WEB-INF文件或目录。
web.xml:是Web应用程序部署描述文件,一定是放在WEB-INF根目录下
lib:放置JAR文件的目录,一id那个放在WEB-INF根目录下
classes:放置编译过后.class文件的目录,一定是放在WEB-INF目录下。编译过后的类文件,必须有与包名称相符的目录结构。
- 2.3 进阶部署设置
URL模式设置
requestURI = contextPath + servletPath + pathInfo
1、环境路径:使用HttpServletRequest的getRequestURI()来取得这项信息,其中contextPath是环境路径(Context Path),是容器用来决定该挑选哪个Web应用程序的依据
可使用HttpServletRequest的getContextPath()来取得环境路径。决定哪个Web应用程序来处理后,就进行Servlet挑选,Servlet必须设置URL模式。
路径映射:以“/”开头,但以“/*”结尾的URL模式。/guest/test.view
扩展映射:以“*.”开头的URL模式。若URL模式设置为*.view结尾的请求,都会交由该Servlet处理
环境根目录映射:空字符串“”是一个特殊的URL模式,对应至环境根目录,也就是"/"的请求。
预设Servlet:仅包括“/”的URL模式,当找不到合适的URL模式对应时,就会使用预设的Servlet。
完全匹配:不符合以上设置的其他字符串,都要作路径的严格对应。
2、Servlet路径:直接对应至URL模式信息,可使用HttpServletRequest的getServletPath()来取得
3、路径信息:指不包括环境路径与Servlet路径部分的额外路径信息,可使用HttpServletRequest的getpathinfo()来取得。
package cc.openhome; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; /**
* Created by Administrator on 2016/4/6.
*/ //继承HttpServlet
public class HelloServlet extends HttpServlet {
//重新定义doGet()
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应内容类型
resp.setContentType("text/html;charset=UTF-8");
//取得响应输出对象
PrintWriter out = resp.getWriter();
//取得“请求参数”
String name = req.getParameter("name"); out.println("<html>");
out.println("<head>");
out.println("<title>Hello Servlet</title>");
out.println("</head>");
out.println("<body>");
//输出Hello
out.println("<h1>Hello! " + name + " !</h1>"); out.println(req.getRequestURI() + "<br>");
out.println(req.getContextPath() + "<br>");
out.println(req.getServletPath() + "</body>");
out.println(req.getPathInfo() + "</hetml>"); out.close();
}
}
Web目录结构
一个Web应用程序基本有以下几个部分:
静态资源、Servlet、JSP、自定义类、工具类、部署描述文件(web.xml)设置信息(Annotation)
/WEB-INF中资源项目的名称与结构:
/WEB-INF/web.xml是部署描述文件
/WEB-INF/classes用来放置应用程序用到自定义类(.class),必须包括包(Package)结构
/WEB-INF/lib放置应用程序用到JAR文件。
使用web-fragment.xml
1、web-fragment.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-fragment xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<!--注册的Servlet名称-->
<servlet-name>HiServlet</servlet-name>
<!--设置的实体类名称-->
<servlet-class>cc.openhome.HiServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HiServlet</servlet-name>
<!--设置的逻辑名称,若有客户端请求/helloUser.view,则由这个Servlet来处理-->
<url-pattern>hi.view</url-pattern>
</servlet-mapping>
</web-fragment>
2、web.xml与web-fragment.xml
使用<absolute-ordering>定义绝对顺序
<absolute-ordering>
<name>WebFragment1</name>
<name>WebFragment2</name>
</absolute-ordering>
web-fragment.xml使用<ordering>,在其中使用<before>或<after>来定义顺序
3、metadata-complete属性
如果将web.xml中<web-app>的metadata-complete属性设置为true,则表示web.xml中已完成Web应用程序的相关定义,部署时将不会扫描标注与web-fragment.xml中定义,xml中<absolute-ordering>与<ordering>也会被忽略。
第二章 编写与设置Servlet的更多相关文章
- 《CoffeeScript应用开发》学习:第二章 编写第一个CoffeeScript应用程序
CoffeeScript基础 语句 CoffeeScript没有分号,语句由新的一行结束,但是可以使用\将语句延续至下一行. 有时可以跨行实现函数调用: "foo". .conca ...
- [Maven实战-许晓斌]-[第二章]-2.4设置HTTP代理
- 【PYTEST】第二章编写测试函数
知识点: assert 测试函数标记 跳过测试 标记预期失败的测试用例 1. asseet 返回的都是布尔值,等于False(F) 就是失败, assert 有很多 assert something ...
- 编写高质量代码:改善Java程序的151个建议(第二章:基本类型)
编写高质量代码:改善Java程序的151个建议(第二章:基本类型) 目录 建议21:用偶判断,不用奇判断 建议22:用整数类型处理货币 建议23:不要让类型默默转换 建议24:边界还是边界 建议25: ...
- [翻译]编写高性能 .NET 代码 第二章:垃圾回收
返回目录 第二章:垃圾回收 垃圾回收是你开发工作中要了解的最重要的事情.它是造成性能问题里最显著的原因,但只要你保持持续的关注(代码审查,监控数据)就可以很快修复这些问题.我这里说的"显著的 ...
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少分配率, 最重要的规则,缩短对象的生命周期,减少对象层次的深度,减少对象之间的引用,避免钉住对象(Pinning)
减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少GC回收时的压力,同时降低了内存碎片与CPU的使用量.你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突. 你需要在设计对象时仔细检 ...
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 将长生命周期对象和大对象池化
将长生命周期对象和大对象池化 请记住最开始说的原则:对象要么立即回收要么一直存在.它们要么在0代被回收,要么在2代里一直存在.有些对象本质是静态的,生命周期从它们被创建开始,到程序停止才会结束.其它对 ...
- Testlink1.9.17使用方法(第二章 登录&汉化设置)
第二章 登录&汉化设置 QQ交流群:585499566 1,使用超级账户admin/admin登录. 2,登录后,会提示创建一个新的项目,先不要创建,先进入用户管理,设置成中文显示,也就是汉化 ...
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 避免使用终结器,避免大对象,避免复制缓冲区
避免使用终结器 如果没有必要,是不需要实现一个终结器(Finalizer).终结器的代码主要是让GC回收非托管资源用.它会在GC完成标记对象为可回收后,放入一个终结器队列里,在由另外一个线程执行队列里 ...
随机推荐
- 软件工程(FZU2015)赛季得分榜,第一回合
目录 第一回合 第二回合 第三回合 第四回合 第五回合 第6回合 第7回合 第8回合 第9回合 第10回合 第11回合 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分 ...
- Pyhont-Urllib2
Urllib2 相当于的Urllib 的升级版 但又不能代替 Urllib 这个我得新手很费解呢...这个问题留着把,,等以后成大牛的时候在回来想想这儿问题!! Urllib2 常用 // 1 设置 ...
- LCA最近公共祖先 ST+RMQ在线算法
对于一类题目,是一棵树或者森林,有多次查询,求2点间的距离,可以用LCA来解决. 这一类的问题有2中解决方法.第一种就是tarjan的离线算法,还有一中是基于ST算法的在线算法.复杂度都是O( ...
- Advanced Office Password Recovery如何设置快捷方式
一般软件安装成功之后都会在桌面上形成快捷方式以方便使用,但是一些用户发现Advanced Office Password Recovery这种office密码破解工具安装成功后桌面上没有出现快捷方式, ...
- hihoCoder 后缀数组 重复旋律
#1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...
- RabbitMQ 实现RPC
实现RPC 首先要弄明白,RPC是个什么东西. (RPC) Remote Procedure Call Protocol 远程过程调用协议 在一个大型的公司,系统由大大小小的服务构成,不同的团队维护不 ...
- phpexcel导入数据提示失败
phpexcel导入excel时明明只有几行数据,却提示506行失败,原来是excel中有506行"无效数据"(看起来是空的,但是和没有数据不一样).
- JS复习--更新结束
js复习-01---03 一 JS简介 1,文档对象模型 2,浏览器对象模型 二 在HTML中使用JS 1,在html中使用<script></script>标签 2,引入外部 ...
- 各种HTTP状态的含义
在网站建设的实际应用中,容易出现很多小小的失误,就像MySQL当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样,Google无法验证网站几种解决办法,提及到由于 ...
- yield和send的执行循序彻底搞清
yield: 对于yield方法和Generator的send同时使用时的执行顺序一直搞不清,今天看到这篇 理解PHP中的Generator 加上测试,终于搞清了. 总结一下上文中的结论: Gener ...