前言-------- 每一天都有好多诱惑,克制自己,努力学习,终于把知识点总结完,周末这几天没怎么学。。。。走在编程的路上,加油
目录
ServletContext对象
ServletContext对象的创建
当Tomcat服务器启动的会为每一个工程创建一个ServletContext对象,只会创建一个。
根据ServletConfig 调用 getServletContext() 获得ServletContext对象
或者直接调用 ServletContext servletContext = getServletContext(); 获取该对象
当服务器关闭的时候销毁ServletContext对象
ServletContext对象何时创建何时销毁?
服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象
从服务器移除托管,或者是关闭服务器。
ServletContext的作用范围
只要在这个项目里面,都可以取。 只要同一个项目。 A项目 存, 在B项目取,是取不到的。 ServletContext对象不同。
ServletContext对象的作用
- 获取全局参数
1、在web.xml文件中添加全局参数,如下
<context-param> <param-name>name</param-name> <param-value>zhangsan</param-value> </context-param> <context-param> <param-name>adress</param-name> <param-value>lisi</param-value> </context-param>
2、在自己的Servlet中获取全局参数,只要是是一个工程下的Servlet都可以访问该全局参数
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = getServletContext(); //根据参数的名字获取参数对应的value值 String name = servletContext.getInitParameter("name"); String adress = servletContext.getInitParameter("adress"); //获得所有参数的名字 Enumeration<String> initParameterNames = servletContext.getInitParameterNames(); while (initParameterNames.hasMoreElements()){ String key = initParameterNames.nextElement(); String value = servletContext.getInitParameter(key); System.out.println("key="+key+" value="+value); } // System.out.println("name="+name+" adress="+ adress); }
- 获取web应用中资源
1、首先在web工程中建立一个资源(config.propreties)文件
2、获取该资源
第一种方法:InputStream is = new FileInputStream(绝对路径);
获得绝对路径的方法:servletContext.getRealPath(" ");
在绝对路径的基础上找到跟具体的路径: String realPath = servletContext.getRealPath("/file/config.properties");
获得当前的相对路径:servletContext.getContextPath();
/* * 这个方法写绝对路径和相对路径都可以 * 相对路径:这里的相对路径和mysql-all里面的不一样,因为这个不是单纯的java项目,是web项 目,刚开始是java虚拟机管理 * 后来就交给了Tomcat管理,所以这里的 相对路径 不能写,直接写绝对路径 * */ //在种写法不是在Tomcat的资源根目录下 // InputStream is = new FileInputStream("D:\\idea\\idea_project\\javahou\\TwoServletWeb\\web\\file\\config.properties"); //这种写法表示Tomcat的根目录下的绝对路径 InputStream is = new FileInputStream(realPath);
第二种方法:InputStream is = ServletContextDemo2.class.getClassLoader().getResourceAsStream("../../file/config.properties");
/*ServletContextDemo2.class 获得当前java文件的class字节码对象 * getClassLoader() 获得将这个class字节码对象加载到虚拟机的类加载器对象 * (正常java项目是src目录,但是这个是web项目,后期是交给Tomcat管理,所以是classes目录下) * getResourceAsStream("资源的相对路径") * 相对路径:必须有一个参照物 * 参照物是getClassLoader()对象的路径 D:\idea\idea_project\javahou\TwoServletWeb\web\WEB-INF\classes * 所以要想找到你的资源,,必须返回上一级的上一级目录,就要这样写路径 ../../file/config.properties * ../../ D:\idea\idea_project\javahou\TwoServletWeb\web * ../../file/config.properties D:\idea\idea_project\javahou\TwoServletWeb\web\file\config.properties * */ InputStream is = ServletContextDemo2.class.getClassLoader().getResourceAsStream("../../file/config.properties");
注意:如果当前类没有继承HttpServlet,只是一个java类,不会交由Tomcat管理,所以getClassLoader()获得的目录是src下的目录
第三种方法:引用servletContext.getResourceAsStream() 获取资源。流对象
/*当然是隐藏的Tomcat的根路径 D:\idea\idea_project\javahou\out\artifacts\TwoServletWeb_war_exploded\ * 相对路径:参照物是当前路径:D:\idea\idea_project\javahou\out\artifacts\TwoServletWeb_war_exploded\ * file\config.properties * * 所以路径为:D:\idea\idea_project\javahou\out\artifacts\TwoServletWeb_war_exploded\file\config.properties * * 绝对路径:没有参照物,这里不使用 * D:\idea\idea_project\javahou\out\artifacts\TwoServletWeb_war_exploded\file\config.properties * */ InputStream is = servletContext.getResourceAsStream("file/config.properties");//注意 / 和 \ 的区别
- 实现数据在Servlet之间的共享,使用ServletContext的存取数据,作用域是一个工程内部,也叫作域对象
1、定义一个登录的html页面,定义一个form表单
2、定义一个LoginServlet,获取数据,并判断用户名密码是否正确,正确跳转新的页面,错误提示信息
并存入登录总数的信息
3、正确的页面定义一个超链接,,建立一个CountServlet,获得在LoginServlet中存入的登陆的总数,并输出
注意点:细节
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>
HttpServletRequest对象
HttpServletRequest作用
封装了客户端提交过来的所有数据
获取客户端请求的头信息
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //HttpServletRequest封装了客户段提交的所有信息 //获取请求所有头信息的名字 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()){ String name = headerNames.nextElement(); //获取所有头信息名字对应的值 String value = request.getHeader(name); System.out.println(name+" = "+value); } }
获取客户端提交过来的数据
1、建立一个req.html文件,写一个form表单提交数据
2、在ServletRequestDemo中获取数据
private void text1(HttpServletRequest request) {
//获取客户端提交的数据,参数必须和前端中的name属性的值一致
String username = request.getParameter("username");
String password = request.getParameter("password");
// System.out.println(username+" "+ password);
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keySet = parameterMap.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()){
String key = iterator.next();
System.out.println("key="+key + "--的值总数有:"+parameterMap.get(key).length);
String[] strings = parameterMap.get(key);
String value = strings[0];
System.out.println(key+" = "+value);
}
}
获取中文数据,并解决乱码问题
当客户端提交数据到服务器的时候,数据是中文的话会出现乱码问题,解决办法有以下几种方式
- Get方式提交数据
get方式请求过来的数据,在url地址栏上就已经经过编码了,(具体以什么格式进行编码的得看前端采用的什么编码),所以我们收到的数据就乱码了。
Tomcat接受这批数据,getParameter()方法获取参数的值默认是以ISO-8859-1的编码去解码
如果编码和解码不一致,就会产生乱码
1、代码转码的方式解决
先让文字回到ISO-8859-1对应的字节数组,然后再以utf-8的格式拼接字符
2、直接配置Tomcat里面的配置文件 D:\apache-tomcat-8.5.20\conf\server.xml ,添加URIEncoding="utf-8"
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
- POST方式提交数据
post方式提交的数据,数据是以流的方式提交给服务器的,数据在请求体中,不是跟在url后面!
Tomcat接受这批数据,getParameter()方法获取参数的值默认是以ISO-8859-1的编码去解码
编码和解码不一致就会出现乱码
1、使用 request.setCharacterEncoding("utf-8")
这个方法表示设置 请求体 里面的文字的编码,告诉getPrameter使用什么格式的编码进行解码。如果是get方式不起作用!
如果客户端以gbk的格式进行编码发送给服务器,在服务器中使用utf-8格式进行解码,一样会乱码
这行设置一定要写在请求getParameter() 方法的前面
2、与Get方式提交数据一样,代码转码的方式
先让文字回到ISO-8859-1对应的字节数组,然后再以utf-8的格式拼接字符串
String s = new String(username.getBytes("ISO-8859-1"), "utf-8");
HttpServletResponse对象
HttpServletResponse作用
封装了响应给客户端一切数据,负责将数据返回到当前的页面上,并通过浏览器展示出来。
其中有重定向:是跳转到另一个页面去,不是当前的页面
其中有服务器内部跳转这个是HttpServletRequest对象:是通过服务器内部的跳转,在客户端看不出来,客户端的url还是显示当前的页面
将数据输出到当前页面上去
- 以字符流的方式将数据写入到当前的页面上去,并通过浏览器展示出来
- 以字节流的方式将数据写入带当前的页面上去,并通过浏览器展示出来
响应中文数据,解决乱码问题
当服务器响应给客户端数据得时候,如果数据是中文,就会出现乱码问题,解决方式有以下几种
- 以字符流的方式输出 response.getWriter()
当向客户端输出数据以什么格式编码,在客户端以什么格式解码,编码和解码一致就不会出现乱码问题
使用response.setCharacterEncoding("utf-8"); 服务器端发送数据编码
response.setHeader("Content-Type","text/html; charset=uf-8"); 客户端解码
- 以字节流的方式输出 response.getOutStream
使用response.getOutputStream().write("哈哈哈哈哈".getBytes("UTF-8")); 服务器端发送数据编码
response.setHeader("Content-Type","text/html; charset=uf-8"); 客户端解码
- 最简单最常用的方式,写在前面,再写数据
response.setContextType("text/html; charset=utf-8")
演练下载资源
当我们的工程里面有一部分资源,希望能够让别人通过网络下载,具体演示过程如下
1、直接建一个html文件,使用超链接下载,不用写Servlet,也能够将东西下载下来
原因是因为我们的Tomcat里面有一个默认的DefaultServlet,,这个Servlet专门处理Tomcat里面的静态资源。
2、怎么才能让浏览器收到资源的时候,以下载的方式提醒用户,而不是直接展示
//直接以下载的方式提醒用户,而不是以浏览器直接展示 response.setHeader("Content-Disposition","attachment; filename="+fileName);
//获得web资源 String fileName = getParameter("fileName"); ServletContext servletContext = getServletContext(); InputStream is = servletContext.getResourceAsStream("download/"+fileName); //读取资源 ServletOutputStream os = Oresponse.getOutputStream(); int len = 0; byte buff = new byte[1024]; //建立一个数组,存储读出来的字节 while((len = is.read(buff)) != -1){ //输出到客户端,以输出流的方式 os.write(buff,0,len); } os.close(); is.close();
如果下载文件是中文名字的话
/*
* 如果文件的名字带有中文,那么需要对这个文件名进行编码处理
* 如果是IE ,或者 Chrome (谷歌浏览器) ,使用URLEncoding 编码
* 如果是Firefox , 使用Base64编码
*/
//获取来访的客户端类型
String clientType = request.getHeader("User-Agent");
//判断字符串中是否是有Firefox字符,有返回true
if(clientType.contains("Firefox")){
fileName = DownLoadUtil.base64EncodeFileName(fileName);
}else{
//IE ,或者 Chrome (谷歌浏览器) ,
//对中文的名字进行编码处理,就是让下载弹出来的提示显示 中文的文件名
fileName = URLEncoder.encode(fileName,"UTF-8");
}
//如果是Firefox浏览器的话,使用Base64编码,使用如下方法
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}