Java Web学习总结(3)Servlet(二)
一,Servlet访问URL映射配置
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
Servlet:该元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。
servlet-mapping:该元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
<servlet>
<servlet-name>HelloServlet</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet关联的类 -->
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>
同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名
<servlet>
<servlet-name>HelloServlet</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet关联的类 -->
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello1.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello2.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>



二,ServletURL通配符:*
在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:
格式一:*.扩展名"
<servlet>
<servlet-name>HelloServlet</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet关联的类 -->
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>*.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>

格式二:以正斜杠(/)开头并以"/*"结尾
<servlet>
<servlet-name>HelloServlet</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet关联的类 -->
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello/*</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>

三,缺省Servlet
Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。 凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理。
<servlet>
<servlet-name>HelloServlet</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet关联的类 -->
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>

四,ServletConfig
ServletConfig代表当前Servlet在web.xml中的配置信息。
1,Servlet初始化参数
在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
例如:
<servlet>
<servlet-name>HelloServlet</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet关联的类 -->
<init-param>
<param-name>name</param-name>
<param-value>Zender</param-value>
</init-param>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>
2,通过ServletConfig获取Servlet的初始化参数
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
public class HelloServlet extends HttpServlet{
private static final long serialVersionUID = 3903946972744326948L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletConfig
ServletConfig config = this.getServletConfig();
//获取初始化参数
String name = config.getInitParameter("name");
String encode = config.getInitParameter("encode");
//设置编码格式,否则中文会出现乱码
resp.setCharacterEncoding("GBK");
PrintWriter out = resp.getWriter();
out.println("name:" + name);
out.println("encode:" + encode);
}
}

五,ServletContext
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext()方法获得ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
1,获取WEB应用的初始化参数
在web.xml文件中使用<context-param>标签配置WEB应用的初始化参数:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>ServletDemo</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置WEB应用的初始化参数 -->
<context-param>
<param-name>name</param-name>
<param-value>Zender</param-value>
</context-param>
<context-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</context-param>
<servlet>
<servlet-name>HelloServlet</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet关联的类 -->
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>
</web-app>
获取Web应用的初始化参数:
public class HelloServlet extends HttpServlet{
private static final long serialVersionUID = 3903946972744326948L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext
ServletContext context = this.getServletContext();
//获取初始化参数
String name = context.getInitParameter("name");
String encode = context.getInitParameter("encode");
//设置编码格式,否则中文会出现乱码
resp.setCharacterEncoding("GBK");
PrintWriter out = resp.getWriter();
out.println("name:" + name);
out.println("encode:" + encode);
}
}

2,多个Servlet通过ServletContext对象实现数据共享
例如 :ServletTwo获得ServletOne所共享的数据
ServletOne:
public class ServletOne extends HttpServlet{
private static final long serialVersionUID = 3903946972744326948L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//共享的数据
String name = "zender";
//获取ServletContext
ServletContext context = this.getServletContext();
//将name存储到ServletContext对象中
context.setAttribute("name", name);
}
}
ServletTwo:
public class ServletTwo extends HttpServlet{
private static final long serialVersionUID = 3903946972744326948L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext
ServletContext context = this.getServletContext();
//获取初始化参数
String name = (String) context.getAttribute("name");
PrintWriter out = resp.getWriter();
out.println("name:" + name);
}
}
Web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>ServletDemo</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>ServletOne</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.ServletOne</servlet-class><!-- servlet关联的类 -->
</servlet>
<servlet-mapping>
<servlet-name>ServletOne</servlet-name>
<url-pattern>/ServletOne.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping> <servlet>
<servlet-name>ServletTwo</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.ServletTwo</servlet-class><!-- servlet关联的类 -->
</servlet>
<servlet-mapping>
<servlet-name>ServletTwo</servlet-name>
<url-pattern>/ServletTwo.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>
</web-app>
先访问:http://localhost:8081/ServletDemo/ServletOne.html

再访问:http://localhost:8081/ServletDemo/ServletTwo.html

3,用servletContext实现请求转发
context.getRequestDispatcher()方法实现请求转发
ServletOne:
public class ServletOne extends HttpServlet{
private static final long serialVersionUID = 3903946972744326948L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//共享的数据
String name = "zender";
//获取ServletContext
ServletContext context = this.getServletContext();
//将name存储到ServletContext对象中
context.setAttribute("name", name);
context.getRequestDispatcher("/ServletTwo.html").forward(req, resp);
}
}
ServletTwo:
public class ServletTwo extends HttpServlet{
private static final long serialVersionUID = 3903946972744326948L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext
ServletContext context = this.getServletContext();
//获取初始化参数
String name = (String) context.getAttribute("name");
PrintWriter out = resp.getWriter();
out.println("name:" + name);
}
}
Web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>ServletDemo</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>ServletOne</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.ServletOne</servlet-class><!-- servlet关联的类 -->
</servlet>
<servlet-mapping>
<servlet-name>ServletOne</servlet-name>
<url-pattern>/ServletOne.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping> <servlet>
<servlet-name>ServletTwo</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.ServletTwo</servlet-class><!-- servlet关联的类 -->
</servlet>
<servlet-mapping>
<servlet-name>ServletTwo</servlet-name>
<url-pattern>/ServletTwo.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>
</web-app>
访问:http://localhost:8081/ServletDemo/ServletOne.html

访问的是ServletOne.html,浏览器显示的却是ServletTwo.html的内容,这就是使用ServletContext实现了请求转发。
4,利用ServletContext对象读取资源文件

获取上图的config.properties资源文件内容:
GetProperties.Java:
public class GetProperties extends HttpServlet{
private static final long serialVersionUID = 3903946972744326948L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置浏览器编码格式为UTF-8
resp.setHeader("content-type","text/html;charset=UTF-8");
resp.getWriter().println("读取src目录下的config.properties配置文件:");
//读取src目录下的properties配置文件
readProperties(resp,"/WEB-INF/classes/config.properties");
resp.getWriter().println("<hr/>读取WebRoot目录下的config.properties配置文件:");
//读取WebRoot目录下的properties配置文件
readProperties(resp,"config.properties");
}
/**
*
* @方法名: readProperties
* @描述: 获取properties配置文件内容
* @param resp
* @param fileUrl
* @throws IOException
* @创建人 zender
*/
protected void readProperties(HttpServletResponse resp, String fileUrl) throws IOException{
//2种方式都能获取到config.properties
//InputStream in = new FileInputStream(this.getServletContext().getRealPath(fileUrl));
InputStream in = this.getServletContext().getResourceAsStream(fileUrl);
Properties prop = new Properties();
prop.load(in);
String url = prop.getProperty("database.url");
String username = prop.getProperty("database.username");
String password = prop.getProperty("database.password");
resp.getWriter().println(
MessageFormat.format("url={0},username={1},password={2}", url,username, password)
);
}
}
Web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>ServletDemo</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>GetProperties</servlet-name><!-- servlet名称 -->
<servlet-class>com.zender.servlet.GetProperties</servlet-class><!-- servlet关联的类 -->
</servlet>
<servlet-mapping>
<servlet-name>GetProperties</servlet-name>
<url-pattern>/GetProperties.html</url-pattern><!-- servlet访问路径 -->
</servlet-mapping>
</web-app>
访问路径:http://localhost:8081/ServletDemo/GetProperties.html

Java Web学习总结(3)Servlet(二)的更多相关文章
- java web学习总结(六) -------------------servlet开发(二)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- Java Web 学习与总结(二)Servlet核心接口+Servlet3.0配置
Servlet3.0版本对Servlet配置进行了重大变革,Servlet类不需要再麻烦的去编辑web.xml文件了,只需要在类上面进行注释就可以了,获得了 Java 社区的一片赞誉之声,以下是新增的 ...
- java web 学习六(servlet开发2)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- java web学习总结(五) -------------------servlet开发(一)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- java web 学习五(servlet开发1)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- java web 学习总结之 Servlet/JSP 编码问题
Servlet和JSP编码问题 字节流: 1.得到OutputStream 字节流 OutputStream os = response.getOutputStream(); 用默认编码输出数据 ...
- [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- java web 学习笔记 编码问题总结
java web 学习笔记 编码问题总结 1.非form表单中提交的中文参数---------------------------传递给Servlet服务器时,默认以iso-8859-1解码 ...
- Java Web学习笔记之---EL和JSTL
Java Web学习笔记之---EL和JSTL (一)EL (1)EL作用 Expression Language(表达式语言),目的是代替JSP页面中复杂的代码 (2)EL表达式 ${变量名} ( ...
- Java Web 学习路线
实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...
随机推荐
- ANTLR4将BF翻译成CPP
实验环境: 操作系统:windows 10 JAVA:JDK 1.8 antlr:antlr-4.7.1-complete.jar IDE:IntelliJ IDEA 2017.2.7 实验目的: 实 ...
- PHP-会话技术
B/S 请求响应模式是无状态的.任意的请求间不存在任何的联系,不能将请求状态保持下去. 会话技术可以给每个浏览器分配持久数据,这些数据不会随着一次请求和相应结束而销毁. COOKIE cookie 是 ...
- Ubuntu下apt-get 安装apache2、php、mysql后的默认路径
apache: 采用apt-get 在线安装,安装路径应在/etc/apache2目录下 apache配置文件/etc/apache2/apache2.conf Apache模块路径:/usr/sbi ...
- telnet批量检测端口状态(linux)
批量检测端口通信: 准备文件树状图 telnet.sh 脚本内容如下: 文件说明 telnet_alive.txt : 活动的端口 telnet_die.txt : 离线的端口 telnet ...
- Mac003--Maven安装与环境变量配置
Mac--Maven安装 一.应用brew安装maven及安装位置 打开终端,输入命令:brew install maven 参考博客:https://www.jianshu.com/p/230e0b ...
- oracle三大范式
范式: 设计数据库定义的一个规则, 三大范式, 灵活运用, 人的思想是活的 一范式 1, 不存在冗余数据 同一个表中的记录不能有重复----所以主键(必须有) 2, 每个字段必须是不可再分的信息(列不 ...
- OAUTH2.0协议-菜鸟级
OAUTH2.0入门必看 一.摘要 OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即 ...
- 在Eclipse的kepler中执行OSGIproject出错的解决方式
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/canlets/article/details/29620301 今天学习OSGI的过程中依照书上所述 ...
- linux的各种安装配置和编译首页
VMware与Centos系统安装 https://www.cnblogs.com/LLBFWH/articles/10991478.html centos7安装python3 以及tab补全功能 h ...
- vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin
场景: . webpack2.4.*集成vue-loader@15.7.2报错 原因: 参考官方文档 https://vue-loader.vuejs.org/migrating.html#a-plu ...