JavaWeb之servlet(2)
servlet(2)
ServletContext
servlet的上下文
每个jvm的虚拟机中的每个web工程都只有一个ServletContext工程,即在一个web工程中,无论写了多少个Java类只要获取该类对象,那么得到的该类对象都是同一个。
如何获取该类对象
ServletContext context = getServletContext();
通过servlet类的getServletContext()方法。
作用
1.获取全局配置参数
2.获取web工程中的资源
3.存取数据,servlet间共享数据,域对象
获取全局参数
public String getInitParameter(String name):返回包含指定上下文范围初始化参数值的 String
,如果参数不存在,则返回 null。
获取的内容为:通过web.xml中的< context >元素中的的name值去获取中的value。其中< context >元素独立于 元素存在。
<context-param>
<param-name>gxwf</param-name>
<param-value>18</param-value>
</context-param>
<servlet>
<description></description>
<display-name>t1</display-name>
<servlet-name>t1</servlet-name>
<servlet-class>wf.t1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>t1</servlet-name>
<url-pattern>/t1</url-pattern>
</servlet-mapping>
获取方式
ServletContext sc = this.getServletContext();
String s = sc.getInitParameter("gxwf");
System.out.println("name-gx = "+s);
out:
name-gx = 18
获取web应用中的properties配置文件中的信息
properties配置文件中的数据以 键 = 值
的方式存在,而Properties类会将文件解析为Java中的键值对形式
想要获取properties配置文件中的信息,先通过Properties获取该类对象
Properties p = new Properties();
再通过该对象载入properties配置文件的流对象。然后通过Properties类的getProperty()方法通过指定的键获取对应的值。
以下给出获取流对象的三种方法。
1.通过获取资源在tomcat里面的绝对路径
1.当我们要获取资源时需要先获取其绝对路径
public String getRealPath(String path):为给定虚拟路径返回包含实际路径的 String。例如,
可以通过对 "http://host/contextPath/index.html" 的请求使路径 "/index.html" 返回服务器
文件系统上的绝对文件路径,其中 contextPath 是此 ServletContext 的上下文路径。
该方法在输入path为空字符串的情况下返回工程在tomcat里面的目录(E:\java\apache-tomcat-7.0.52\wtpwebapps\servletcontesttest(servletcontesttest是项目名称))。而输入path为相对路径的情况下会返回工程目录 + 相对路径(E:\java\apache-tomcat-7.0.52\wtpwebapps\servletcontesttest\ file\res.properties ),由此看看出该方法的作用是:先获取web工程在tomcat下的绝对路径,然后再拼接上资源的相对路径,然后在将该字符串返回。
ServletContext sc = this.getServletContext();
Properties p = new Properties();
String s = sc.getRealPath("");
System.out.println("t1-path = "+s);
//E:\java\apache-tomcat-7.0.52\wtpwebapps\servletcontesttest
String path = sc.getRealPath("file/res.properties");
System.out.println("real-path = "+path);
//E:\java\apache-tomcat-7.0.52\wtpwebapps\servletcontesttest\file\res.properties
InputStream in = new FileInputStream(path);
2.通过(InputStream in = new FileInputStream(path);)new出一个流对象。
2.getResourceAsStream 获取资源 流对象
public java.io.InputStream getResourceAsStream(String path)
以 InputStream 对象的形式返回位于指定路径上的资源
该方法类似于1中两方法的相加。
ServletContext sc = this.getServletContext();
InputStream in2 = sc.getResourceAsStream("file/res.properties");
p.load(in2);
String s2 = p.getProperty("gx");
System.out.println(s2);
3.通过classloader去获取web工程下的资源
InputStream in3 = this.getClass().getClassLoader().getResourceAsStream("../../file/res.properties");
通过class方法调用类加载器中的getResourceAsStream()该方法同2中getResourceAsStream 方法相同是由一个内得到配置文件路径的getResource(name)和得到流对象的方法组合而成
public InputStream getResourceAsStream(String name) {
URL url = getResource(name);
try {
return url != null ? url.openStream() : null;
} catch (IOException e) {
return null;
}
}
getResource(name)方法得到的是(/E:/java/apache-tomcat-7.0.52/wtpwebapps/servletcontesttest/WEB-INF/classes/)是tomcat下项目的WEB-INF/classes目录,而我们要得到(E:\java\apache-tomcat-7.0.52\wtpwebapps\servletcontesttest\file\res.properties)所以在使用时要先回到,项目的根目录。
InputStream in3 = this.getClass().getClassLoader().getResourceAsStream("../../file/res.properties");
完整的获取web应用中的properties配置文件中的信息代码
preperties文件内容
gx=18
代码
ServletContext sc = this.getServletContext();
Properties p = new Properties();
//方法1
// String s = sc.getRealPath("");
// System.out.println("t1-path = "+s);
// //E:\java\apache-tomcat-7.0.52\wtpwebapps\servletcontesttest
// String path = sc.getRealPath("file/res.properties");
// System.out.println("real-path = "+path);
// //E:\java\apache-tomcat-7.0.52\wtpwebapps\servletcontesttest\file\res.properties
// InputStream in = new FileInputStream(path);
// p.load(in);
// String s1 = p.getProperty("gx");
// System.out.println(s1);
//方法2
// InputStream in2 = sc.getResourceAsStream("file/res.properties");
// p.load(in2);
// String s2 = p.getProperty("gx");
// System.out.println(s2);
//方法3
URL s3 = this.getClass().getClassLoader().getResource("");
//file:/E:/java/apache-tomcat-7.0.52/wtpwebapps/servletcontesttest/WEB-INF/classes/
System.out.println(s3);
InputStream in3 = this.getClass().getClassLoader().getResourceAsStream("../../file/res.properties");
p.load(in3);
String s4 = p.getProperty("gx");
System.out.println(s4);
使用ServletContext存取数据。
1.定义一个html页面定义一个form表单,命名login.html
form表单中的action表示了该页面信息传入的位置(即信息传入了哪一个servlet,此处为传入t1)
注意:此处的t1不是表示下面的servlet名称t1,而是在web.xml文件配置中url-pattern中的名称
<servlet>
<description></description>
<display-name>t1</display-name>
<servlet-name>t1</servlet-name>
<servlet-class>wf1.t1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>t1</servlet-name>
<!--目标位置-->
<url-pattern>/t1</url-pattern>
</servlet-mapping>
<servlet>
<body>
<h2>请输入账号与密码</h2>
<form action="t1" method = "get">
账号:<input type="text" name = "username"/><br>
密码:<input type="text" name = "password"/><br>
<input type="submit" name = "登陆"/><br>
</form>
</body>
2.定义一个servlet,名为t1
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* HttpServletRequest request:请求对象,包含从浏览器传入的信息
* HttpServletResponse response:响应对象,通过该对象返回信息给浏览器
*/
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username = "+username);
System.out.println("password = "+password);
//response.getWriter()创建一个流对象,通过该对象可以向浏览器打印字符串
PrintWriter out = response.getWriter();
//做判断,看传入的值是否为我们想要的
if("admin".equals(username)&& "123".equals(password)) {
//在控制台打印
// System.out.println("登陆成功");
//在浏览器端打印(此处的字符串应为英文,若输入中文会产生乱码,该问题后面解决)打印的东西会覆盖以前的信息
// out.write("login success...");
//此处为计算该servlet被访问的次数
//getServletContext().getAttribute("count");该类返回一个object对象。如果对应count的值不存在,则返回null。
Object obj = getServletContext().getAttribute("count");
int oldnum = 0;
//判断obj是否为null,为null就说明该servlet第一次被访问oldnum值不变,不为null就把obj转为int并赋值给oldnum
if(obj != null) {
oldnum = (int)obj;
}
System.out.println("网站访问次数 = "+oldnum);
//将新的count与对应的值oldnum + 1设置到文件中
![servletcontext01](C:\Users\wf\Desktop\笔记\resourse\servletcontext01.png)
//通过响应一个状态码303,使网页跳转到新的页面。login_success.html
response.setStatus(303);
response.setHeader("Location", "login_success.html");
}else {
// System.out.println("登录失败");
out.write("login filed...");
}
}
3.编写新的html页面显示成功后的网页, 命名login_success.html
将跳转页面设置为t2
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>登陆成功</h2>
<a href = "t2">查看网站登陆次数</a>
</body>
</html>
4.再编写一个servlet命名t2对成功后操作
public class log_success extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//向网页打印访问次数
Integer a = (int) getServletContext().getAttribute("count");
PrintWriter out = response.getWriter();
//System.out.println("登陆次数 : "+a);
out.write(a.toString() +"--" + 4);
out.write(99);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
ServletContext存取值分析
细节:
<!--
A路径: Servlet的路径
http://localhost:8080/Demo4/login
B路径: 当前这个html的路径:
http://localhost:8080/Demo4/login.html -->
<form action="login" method="get">
账号:<input type="text" name="username"/><br>
密码:<input type="text" name="password"/><br>
<input type="submit" value="登录"/>
</form>
ServletContext的创建和销毁时期
创建:服务器在启动时,会为托管的每一个web应用程序,创建一个ServletContext对象
销毁:从服务器中移除托管,或关闭web应用程序所在的服务器
servletContext的作用范围
只要在同一个项目中都可以使用。
JavaWeb之servlet(2)的更多相关文章
- JavaWeb学习——Servlet相关的接口和类
JavaWeb学习——Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...
- JavaWeb之Servlet入门(二)
1. 准备 在JavaWeb之Servlet入门(一)中,我们完成了第一个Servlet程序,完成了从URL到后台控制器的中转过程,接下来我们延续JavaWeb之Servlet入门(一)学习下如何传参 ...
- JavaWeb学习--Servlet认识
Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...
- IDEA新建javaWeb以及Servlet简单实现
刚开始用IDEA开发,还不太熟悉,因此写一个教程,加深印象 1.新建一个Web项目 两种方法:java 和 Java Enterprise(推荐) 第一种)通过Java工程创建,这个方法需要手动导入T ...
- Intellij IDEA创建javaWeb以及Servlet简单实现
1.创建web工程 File --> New --> Project...
- javaweb之servlet 全解
①Servlet概述 ⑴什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求, 服务器会把接收到的请求交给Servlet来处理,在Serv ...
- JavaWeb学习—Servlet
1.什么是Servlet Servlet是一个继承HttpServlet类的Java类 Servlet必须部署在web服务器端,用来处理客户端的请求 2.Servlet运行过程 Web Client ...
- JavaWeb之Servlet总结
今天上班居然迟到了,昨天失眠了,看完吐槽大会实在不知道做些什么,刚好朋友给我发了两个JavaWeb的练习项目,自己就又研究了下,三四点才睡,可能周日白天睡的太多了,早上醒来已经九点多了,立马刷牙洗脸头 ...
- javaWEB之Servlet
Servlet 1. 什么是Servlet * Servlet是JavaWeb三大组件之一(Servlet.Filter.Listener) * Servlet是用来处理客户端请求的动态资源 * ...
- Intellijidea建javaWeb以及Servlet简单实现
一.创建并设置javaweb工程1.创建javaweb工程File --> New --> Project... 点击Project后出现如下界面,选择Java Enterprise,选中 ...
随机推荐
- 学习使人快乐9--eclipse常用快捷键总结
Ctrl + F11 按上次方式执行Ctrl + Shift + / 加上注释/**/Ctrl + Shift + \ 取消注释/**/Ctrl + / 加上或消除行注释Ctrl + D 删除当前行 ...
- C#基本语法<三>_WindowsFrom
winform 在windows form开发过程中还是有很多坑需要注意,包括一些重要代码记不得,在这个文件中进行汇总更新. 命名规则 M结尾表示model A结尾表示消息 Object表示 ,底层接 ...
- vue-cli 引用elementUI打包后文件过大
解决方案:使用externals引用第三方资源,防止element资源被打包到自己项目中,(总共修改3个页面index.html.webpack.base.conf.js.main.js) 1.修改i ...
- Android Studio 3.0 及以上版本使用技巧总结
1.更新Android Studio后下载Gradle文件的技巧 更新到3.0版本后,可能会出现创建新项目一直停留在如下图的界面: 选择等待?不知道要等到什么时候,这时候怎么办呢?显然,不能一直等待下 ...
- LeetCode刷题191117
博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教.题目及解法来自于力扣(LeetCode),传送门. 算法: 题目: 给出一个 32 位的有符号整数,你需要将这个整数中每位上 ...
- Flask报如下错误:SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True or False to suppress this warning.
在同一个项目中由于flask_sqlalchemy版本不同,有时会报如下错误 错误信息如下: flask_sqlalchemy\__init__.py:: UserWarning: SQLALCHEM ...
- 跑健壮性Monkey,出现一次Crash全过程-日志分析-董浩-Dotest
最近带着学生做的某个项目,跑健壮性Monkey,出现一次Crash全过程-日志分析: 准备:搭建adb环境.安装实际测试包:开始: Monkey命令: 1 2 3 4 5 adb shell monk ...
- 浅谈JS重绘与回流
在说浏览器渲染页面之前,我们需要先了解两个点,一个叫 浏览器解析 URL,另一个就是本章节将涉及的 重绘与回流: 重绘(repaint):当元素样式的改变不影响布局时,浏览器将使用重绘对元素进行更新, ...
- [配置]VUE中通过process.env判断开发,测试和生产环境,并分环境配置不同的URL HOST
本文链接:https://blog.csdn.net/tom_wong666/article/details/89763620 Tom哥的博客博文分类和索引页面地址:https://blog.csdn ...
- leetcode 5199. 交换字符串中的元素
地址 https://leetcode-cn.com/contest/weekly-contest-155/problems/smallest-string-with-swaps/ 给你一个字符串 ...