一、Servlet中的线程安全问题
在Servlet中定义变量,除非特殊要求,尽量使用局部变量。
如果有需要实例变量时,应做同步处理,且同步代码块尽量包围少的代码。
二、Servlet的配置对象:
ServletConfig:(容器来创建)
作用:代表了Servlet配置中的参数信息。
比如在web.xml中的参数配置如下:
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>cn.itcast.servlet.ServletDemo2</servlet-class>
<init-param><!-- aaa=bbb -->
<param-name>aaa</param-name>
<param-value>bbb</param-value>
</init-param>
<init-param>
<param-name>xxx</param-name>
<param-value>yyy</param-value>
</init-param>
</servlet>
三、ServletContext详解
1、在应用被服务器加载时就创建ServletContext对象的实例。每一个JavaWeb应用都有唯一的一个ServletContext对象
它就代表着当前的应用。
2、如何得到ServletContext对象:ServletConfig.getServletContext();
3、有什么用?
3.1ServletContext对象是一个域对象(域对象就是说其内部维护了一个Map<String,Object>)
Object getAttribute(String name):根据名称获取绑定的对象
Enumeration getAttributeNames() :获取ServletContext域中的所有名称
void removeAttribute(String name):根据名称移除对象
void setAttribute(String name,Object value):添加或修改对象。
3.2实现多个Servlet之间的数据共享
3.3获取WEB应用的初始化参数(应用的全局参数)
在web.xml的根元素下配置一下信息:
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
这些参数就属于整个应用的全局参数,使用ServletContext来读取。
3.4读取资源文件的三种方式:
利用ServletContext.getRealPath():
特点:读取应用中任何文件。只能在Web环境下用
利用ResourceBundle读取配置文件
特点:可以用在非web环境下。但是只能读取类路径中的properties文件
利用类加载器读取配置文件(专业)
特点:可以用在非web环境下。可以读取类路径下的任何文件。
Tips:更改MyEclipse生成的Servlet的模板(8.5)
1、关闭你的MyEclipse
2、找到MyEclipse的安装目录C:\Program Files\Genuitec
3、搜索*wizard*(com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar)
4、打开,找到templates\Servlet.java,这个文件就是MyEclipse生成Servlet的模板代码
5、弄出来,做好备份,开始修改。
四、请求和响应对象概述
HTTP协议包含请求和响应部分。
HttpServletRequest就代表着请求部分
HttpServletResponse就代表着响应部分
五、HttpServletResponse详解
5.1输出中文数据:
字节流:
out.write("中文".getBytes("UTF-8"));有乱码
解决办法:
方式一:更改浏览器的查看编码(不可取)
通知浏览器,使用的码表
方式二:response.setHeader("Content-Type", "text/html;charset=UTF-8");
方式三:response.getOutputStream().write("<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>".getBytes("UTF-8"));
*方式四:response.setContentType("text/html;charset=UTF-8");//方式二、三、四都是一样的
字符流:
Servlet中的字符流默认查ISO-8859-1(SUN的Servlet规范要求的)
如何更改这个默认的编码呢?response.setCharacterEncoding("UTF-8");
//不要忘记通知浏览器的编码
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.write(s);//默认查的是ISO-8859-1码表(SUN的Servlet规范要求的)
在字符流输出中文数据时:response.setContentType("text/html;charset=UTF-8");
有两个作用:通知字符流以UTF-8编码输出
通知客户端以UTF-8解码显示
HttpServletResponse细节:
字节流和字符流不能同时使用,互斥的。
通过字符流或字节流输出的数据并不是直接打给浏览器的。而是把数据写到response对象的缓存中的。服务器从缓存中取出数据,按照HTTP协议的响应格式输出给浏览器。
如果你调用的response的输出流没有主动关闭,服务器会替你关的。
在Servlet中定义变量,除非特殊要求,尽量使用局部变量。
如果有需要实例变量时,应做同步处理,且同步代码块尽量包围少的代码。
二、Servlet的配置对象:
ServletConfig:(容器来创建)
作用:代表了Servlet配置中的参数信息。
比如在web.xml中的参数配置如下:
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>cn.itcast.servlet.ServletDemo2</servlet-class>
<init-param><!-- aaa=bbb -->
<param-name>aaa</param-name>
<param-value>bbb</param-value>
</init-param>
<init-param>
<param-name>xxx</param-name>
<param-value>yyy</param-value>
</init-param>
</servlet>
三、ServletContext详解
1、在应用被服务器加载时就创建ServletContext对象的实例。每一个JavaWeb应用都有唯一的一个ServletContext对象
它就代表着当前的应用。
2、如何得到ServletContext对象:ServletConfig.getServletContext();
3、有什么用?
3.1ServletContext对象是一个域对象(域对象就是说其内部维护了一个Map<String,Object>)
Object getAttribute(String name):根据名称获取绑定的对象
Enumeration getAttributeNames() :获取ServletContext域中的所有名称
void removeAttribute(String name):根据名称移除对象
void setAttribute(String name,Object value):添加或修改对象。
3.2实现多个Servlet之间的数据共享
3.3获取WEB应用的初始化参数(应用的全局参数)
在web.xml的根元素下配置一下信息:
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
这些参数就属于整个应用的全局参数,使用ServletContext来读取。
3.4读取资源文件的三种方式:
利用ServletContext.getRealPath():
特点:读取应用中任何文件。只能在Web环境下用
利用ResourceBundle读取配置文件
特点:可以用在非web环境下。但是只能读取类路径中的properties文件
利用类加载器读取配置文件(专业)
特点:可以用在非web环境下。可以读取类路径下的任何文件。
Tips:更改MyEclipse生成的Servlet的模板(8.5)
1、关闭你的MyEclipse
2、找到MyEclipse的安装目录C:\Program Files\Genuitec
3、搜索*wizard*(com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar)
4、打开,找到templates\Servlet.java,这个文件就是MyEclipse生成Servlet的模板代码
5、弄出来,做好备份,开始修改。
四、请求和响应对象概述
HTTP协议包含请求和响应部分。
HttpServletRequest就代表着请求部分
HttpServletResponse就代表着响应部分
五、HttpServletResponse详解
5.1输出中文数据:
字节流:
out.write("中文".getBytes("UTF-8"));有乱码
解决办法:
方式一:更改浏览器的查看编码(不可取)
通知浏览器,使用的码表
方式二:response.setHeader("Content-Type", "text/html;charset=UTF-8");
方式三:response.getOutputStream().write("<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>".getBytes("UTF-8"));
*方式四:response.setContentType("text/html;charset=UTF-8");//方式二、三、四都是一样的
字符流:
Servlet中的字符流默认查ISO-8859-1(SUN的Servlet规范要求的)
如何更改这个默认的编码呢?response.setCharacterEncoding("UTF-8");
//不要忘记通知浏览器的编码
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.write(s);//默认查的是ISO-8859-1码表(SUN的Servlet规范要求的)
在字符流输出中文数据时:response.setContentType("text/html;charset=UTF-8");
有两个作用:通知字符流以UTF-8编码输出
通知客户端以UTF-8解码显示
HttpServletResponse细节:
字节流和字符流不能同时使用,互斥的。
通过字符流或字节流输出的数据并不是直接打给浏览器的。而是把数据写到response对象的缓存中的。服务器从缓存中取出数据,按照HTTP协议的响应格式输出给浏览器。
如果你调用的response的输出流没有主动关闭,服务器会替你关的。