一、MIME类型:
告诉客户端以什么方式接收,如果写错了,则以下载方式接收
二、两个小技巧
1、让生产的class文件直接保存在web应用的classes目录下:
构建路径----输出文件夹......
2、资源文件(properties)直接在src目录下建立,那么Eclipse会自动在输出目录下
生成此文件(比如在classes文件夹下生成my.properties)
三、路径问题
1、加斜杠和不加斜杠的区别?
a、加斜杠表示相对于根目录(tomcat的web应用的根目录webapps):
如果你在客户端参数里加了斜杠,那么就要再走到当前目录下你的web应用下
b、不加斜杠表示当前目录(当前文件,还包括了包名):如表单里action,只需要写urlPattern里去斜杠的路径,
表单里提交的post信息跟url地址栏里一样都是要通过http请求提交到服务器的,再由服务器
分析web.xml文件查找servlet路径
四、乱码问题
首先要明白,乱码有两种:一种是从请求里接收的是乱码,一种是响应给客户端的是乱码
1、response.setContentType("text/html;charset=gbk");
:设置返回给客户端的MIME类型和返回的页面防止出现中文乱码
2、request.setCharacterEncoding("gbk")
:设置获取request里的参数为gbk,防止获取乱码
注意顺序:先设置,后获取
3、还有对于request.setCharacterEncoding("gbk"),只能解决获取post方式的,
而不能解决获取get方式的....我们在doPost里调用doGet,其实就是解决了post方式
至于get方式....待续
为什么对get方式无效?
因为此方法setCharacterEncoding("gbk")只对请求的消息体有效,而get方式是在请求的请求行里
五、以下几个比较重要的方法:
1、从资源文件里读取信息并输出
步骤:
a、在src下建立资源文件,这样会自动保存到输出文件夹(比如classes)里
b、//通过类模板获取一个输入流,从classes目录开始查找
//通过类模板,原理就在于通过类去找文件,而不依赖于绝对路径,这样移植之后不用改代码
InputStream in = MyServlet.class.getResourceAsStream("/txt/my.properties")
c、pro.load(in) //从输入流里加载资源文件
d、out.print(pro.getProperty(key)) //通过键获取值,并打印
注意:如果使用系统路径会出错
System.getProperty("user.dir")
这样得到的是tomcat的bin目录,因为服务器启动是从这里开始
2、servlet的配置对象:ServletConfig
首先,要了解一点,web容器解析完请求和相应之后,把所以的信息都放在ServletConfig对象里
从web.xml里读取配置信息,主要是读取<init-param>初始化信息
并且要清楚,ServletConfig只为一个Servlet服务,这是局部的
例子:
//自己本身就从父类继承了getServletConfig()这个方法,所以直接用this获取
ServletConfig config = this.getServletConfig();
//获取初始化参数
String info = config.getInitParameter("paramname");
out.print(info+"<br />");
在web.xml里:
<servlet>
<init-param>
<param-name>paramname</param-name>
<param-value>paramvalue</param-value>
</init-param>
<servlet-name>name</servlet-name>
<servlet-class>com.lovo.SecondServlet</servlet-class>
</servlet>
注意:只对当前这个servlet有效
3、全局上下文对象:ServletContext
对所有的servlet有效,类似于全局变量,web.xml中写在<web-app>根节点下
可以从当前类(this)里获取getServletContext()方法,也可以从Config对象里获取
例:
ServletContext context = this.getServletContext();
info = context.getInitParameter("paramname");
out.print(info);
web.xml里
<web-app>
<context-param>
<param-name>paramname</param-name>
<param-value>paramvalue</param-value>
</context-param>
</web-app>
4、将相对路径变成绝对(物理)路径,即硬盘上的路径
全局上下文对象的ServletContext的getRealPath方法
例:
info = context.getRealPath("/img/lv.jpg");
out.print("物理路径:"+info);
img文件夹在我们建的web应用下myweb/img/lv.jpg
5、从内存中设置和获取全局属性对象(字符串也可以):setAttribute()----getAttribute()
首先明白,底层是map集合
回忆,我们在做通讯服务器项目的时候,在request对象里解析客户端请求,并且封装到map里
所以就是在从request里获取
注意了:request里有这两个属性,上下文对象里也有这两个属性,要全局上下文里的才能被全局
访问,才能作为聊天室原理
例子:
request.setAttribute("str", "myStr"); //可以是字符串
List list = new ArrayList();
list.add("bitch");
list.add("shit");
list.add("fuck");
request.setAttribute("mylist",list); //也可以是对象
out.print(request.getAttribute("str")+"<br>");
out.print(request.getAttribute("mylist"));
注:所谓的全局,也就是在任何一个servlet里都可以设置和取出,并可以设置很多键值对,这也就是聊天室原理!
六、注意在注册第二个servlet时,<servlet>和<servlet-mapping>都是重新写的,并且区分<servlet-name>
七、再次理解web服务器的启动和servlet的生命周期
1、首先,服务器启动,加载所有的web应用
2、web容器实例化servlet,可以在web.xml配置load-on-startup:
服务器启动时就创建servlet实例(正数)或者是第一次接收到请求时才创建(负数或不写)?
3、web容器触发init方法装载资源
4、service.....调用其它如doGet、doPost方法
5、destroy,销毁servlet
八、最后,ServletConfig和ServletContext的关系
出处http://blog.sina.com.cn/s/blog_4b5bc0110100fyxs.html