Servlet
Servlet的概述
Servlet的定义及其作用:Servlet是运行在Web服务器(eg.Tomcat)上的java程序,通过HTTP协议接收好响应来自Web客户端的请求。Servlet的实现
Servlet接口定义了初始化servlet的方法、为请求提供服务的方法和从服务器移除servlet的方法,这些方法成为生命周期方法
Servlet实现方法:定义一个类implements Servlet 或者 Extends GenericServlet/HttpServlet(最常用)
Servlet中的生命周期方法是按以下顺序调用的:
构造Servlet,使用init方法初始化
创建Servlet实例的时候回执行init方法 一个Servlet只会初始化一次,init方法只会被执行一次
处理客户端的请求对service方法的调用
当客户端有请求的时候回调用service方法 一次请求对应着service的执行,所以它可以被多次执行
从服务器中一处Servlet,并用destroy销毁它,最后垃圾回收终止它
Servlet销毁时会执行: 当Servlet从服务器移除时执行; 当关闭服务器时执行
下面是实现了Servlet的代码:
1 | public class Sever_servlet extends HttpServlet{ |
Servlet的配置
在一个Web工程中当我们实现了一个Servlet的时候,我们应该在Web工程中将这的Servlet加入到配置文件Web。xml文件中,配置Servlet。
下面是在web.xml天剑一个Servlet的写法
获取Servlet配置信息
//1. 得到servlet配置对象 专门用于在配置servlet的信息 ServletConfig config = getServletConfig(); //获取到的是配置servlet里面servlet-name 的文本内容 String servletName = config.getServletName(); System.out.println("servletName="+servletName); //2. 可以获取具体的某一个参数。 String address = config.getInitParameter("address"); System.out.println("address="+address); //3. 获取所有的参数名称 Enumeration<String> names = config.getInitParameterNames(); //遍历取出所有的参数名称 while (names.hasMoreElements()) { String key = (String) names.nextElement(); String value = config.getInitParameter(key); System.out.println("key==="+key + " value="+value); }
ServletContext
每个web工程都只有一个ServletContext对象。 在同一个Web工程中不管是哪个servlet,获取到的这个类的对象都是同一个
ServletContext主要有三个作用:
- 获取Web工程的全局配置参数
- 获得Web工程中的资源(properities)
- 存取数据,Servlet间共享数据,即域对象
获取全局配置参数
在web.xml文件中有定义全局参数,每个Servlet都可以访问,而Servlet内部的参数只可以由自己访
通过调用getServletContext()方法可以获得Web工程的ServletContext对象,通过这个对象来访问全局参数
获取Web工程中的资源
Web工程里的properities文件资源
//获取Web工程的ServletContext对象
ServletContext context=getServletContext();
//获得对去加载读取资源的对象property
Properities property=new Properities();
//获取输入流,就是资源
InputStream in=null;
//加载资源并读取
property.load(in);
String city=property.getProperty();
这里的关键是如何读入资源,获得资源的输入流InputStream,有三种方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56//获得Servlet对象
ServletContext context=getServletContext();
Properties properity=new Properties();
//方法一:通过ServletContext的getRealpath()方法获得资源输入流,只需要传入资源的相对路径
/*
* getRealPath("")这个得到的是运行在服务器TomCat中Web项目的根路径
* D:\tomcat\apache-tomcat-7.0.52\apache-tomcat-7.0.52\wtpwebapps\Web\
* getRealPath("file/file.properties")这个会将传入的相对路径拼接到上面的项目根路径的后面
* D:\tomcat\apache-tomcat-7.0.52\apache-tomcat-7.0.52\wtpwebapps\Web\file/file.properties
* */
String path= context.getRealPath("file/file.properties");
InputStream in=new FileInputStream(path);
//方式二:通过context.getResourceAsStream("file/file.properties")直接过得资源的输入流
InputStream in=context.getResourceAsStream("file/file.properties");
//方式三:通过类加载器直接获得资源的输入流
InputStream in=this.getClass().getClassLoader().getResourceAsStream("../../file/file.properities");
properity.load(in);
String city=properity.getProperty("city");
System.out.println("city:"+city);
```
## HttpServletRequest
### 获取客户端的信息
>HttpServletRequest中封装了客户端所有的信息
>通过request可以获得客户端请求头的全部信息和客户端传递的参数
```java
public class Request extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//取出客户端请求里面的所有头信息(名称-值)
Enumeration<String>headers=request.getHeaderNames();
while(headers.hasMoreElements()) {
String name=headers.nextElement();
String value=request.getHeader(name);
System.out.println(name+":"+value);
}
//获得客户端上传的参数
//1.利用枚举方法获得参数
Enumeration<String>parameter=request.getParameterNames();
while(parameter.hasMoreElements()) {
String name=parameter.nextElement();
String value=request.getParameter(name);
System.out.println(name+":"+value);
}
//2.利用Map来获取参数
Map<String,String[]>parameter=request.getParameterMap();
Set<String> paras=parameter.keySet();
Iterator<String> it=paras.iterator();
while(it.hasNext()) {
String name=it.next();
String value=parameter.get(name)[0];
System.out.println(name+":"+value);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}
中文乱码
当客户端提交的数据中有中文的时候会出现乱码的现象,Get和POST方式的解决方法不同
Get请求方式
由于Get请求方式上传提交的数据是在Url地址中的,所以服务器接收的时候已经过编码了,服务器端直接获得的数据是乱码的
//tomcat收到了这批数据,getParameter 默认使用ISO-8859-1去解码 String username = request.getParameter("username"); String password = request.getParameter("password"); //先让文字回到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串 username = new String(username.getBytes("ISO-8859-1") , "UTF-8"); System.out.println("userName="+username+"==password="+password);
直接在tomcat里面做配置,以后get请求过来的数据永远都是用UTF-8编码。
可以在tomcat里面做设置处理 conf/server.xml 加上URIEncoding="utf-8"
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
Post请求
在getParameter之前加入这行代码,是在设置请求体的编码方式request.setCharacterEncoding("UTF-8");
HttpServletResponse
它的作用是响应返回数据给客户端输出数据到页面上
//以字符流的方式写数据
response.getWriter().write("<h1>hello response...</h1>");
//以字节流的方式写数据
response.getOutputStream().write("hello".getBytes());
中文乱码
- 以字符流输出
response.getWriter()
//1. 指定输出到客户端的时候,这些文字使用UTF-8编码
response.setCharacterEncoding("UTF-8");
//2. 直接规定浏览器看这份数据的时候,使用什么编码来看。
response.setHeader("Content-Type", "text/html; charset=UTF-8");
response.getWriter().write("北京");
- 以字节流输出
response.getOutputStream()
//1. 指定浏览器看这份数据使用的码表
response.setHeader("Content-Type", "text/html;charset=UTF-8");
//2. 指定输出的中文用的码表
response.getOutputStream().write("我爱北京".getBytes("UTF-8"));
不管是字节流还是字符流,直接使用一行代码,然后再写数据
response.setContentType("text/html;charset=UTF-8");
id: 96
论文名称:Attention-based Dynamic Preference Model for Next Point-of-Interest Recommendation
作者:Chenwang Zheng and Dan Tao