servlet新手必会
servlet生命周期
既程序员可以操纵的阶段
实例化>初始化>服务>销毁
特点:单例多线程
1.一个servlet实例只会执行一次无参构造器和init()方法 并在第一次运行时访问
2.用户每提交一次对当前servlet的请,就会执行一次servlet方法
3.一个实例servlet方法之后执行一次destory方法销毁 结束
4.默认情况下 servlet在web容器启动时不会被实例化
当你定义一个servlet时候记得在xml添加servlet配置对象
写在WEB—INF中的xml文件中
<servlet>//servlet config 配置对象
<servlet-name>servlettext</servlet-name>
//<load-on-startup>1</load-on-startup>(1)大于0的数就行 有层次关系 数越小越优先
<servlet-class>com.one.servlettext</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlettext</servlet-name>
<url-pattern>/servlettext</url-pattern>
</servlet-mapping>
添加过后这个servlet才能被使用 还有 如果你想在加载服务器的同时运行servlet的话 执行以下操作
各种方法属性
getservletContext()//获取这个对象
getservletName() //获取servlet的名称
getInitparameterNames() //获取所有初始化参数
操作方法://Enumeration是枚举
Enumeration<String> names = config.getInitparameterNames()//获取
//遍历
while(names.hasMoreElements()){
//获取当前的值
String name = names.nextElement();
//获取指定参数的值
String value = config.getInitparameter(name);
System.out.println(name+value)//namebjpowernode adressbj
}//初始化参数 需要自己在xml文件中自己定义内容参数
xml里面写
<init-param>
<param-name>name</param-name>
<param-value>bjpowernode</param-value>
</init-param>
<init-param>
<param-name>adress</param-name>
<param-value>bj</param-value>
</init-param>//写在servlet里边
域属性
所有的文件共享域属性(在一个作用域)
getcontextpath()获取作用域应用的名称(相对路径吧)
getrealpath()获取绝对路径从盘符开始
setAttribute(“key”,“value”)设置域内容
getattribute(key)获取域值
removeattribute(key)删除域值
xml中url-patten的多种写法
1.精确路径模式 可以添加精确的路劲
比如:come——>/a/b/c/come 这其中的abc都不存在 是你自己写进去的
也可以吧/a/b/c/come看做一个整体调用路径
2.通配符路径模式:
比如:/a/ *代表你请求路径只有携带了/a的景区路径
部分才可以被当做当前servlet来处理
比如:/a/asd 或者/a/b/asd /a后面写多少都可以 因为你/ *了
3.全路径模式:使用(/ 或者/)调用 例如:‘’/a/ * 这个可以是任意的字符
只要前面写了/a后边不论加多少路径都可以 /a/b/axljalsd和/a/axljalsd结果一样
/ 的方法和/ *用法一致
/ *和/的区别
1./ *拦截所有的资源包括动态和静态 jsp/HTML
2./ 不会拦截动态的 jsp
4.后缀名拦截 xxx.do 只要是.do结尾全部拦截 不管前面有多少东西
例如:/a/b.do 或者 b.do
注意:后缀名模式和通配符模式不能连用 / *.do是不可以的
原则:1.优先路径匹配:
如果你的路径和两个servlet路径都符合那么运行第一个位置
2.精确路径优先原则
所有路径模式中的大哥 路径精确地直接执行 不论是否在第一位置
3.最长路劲优先原则
类似于2 /sum/ *和/sum/a/b 执行后者
输出流
PrintWriter out=response.getwriter()
out.print/write/append();
输出流 在浏览器中显示你想显示的结果 直接out.方式添加你想假的内容
//获取标准输出流
PrintWriter out = response.getWriter();
//三种输出方式
out.append("123");
out.append("456");
out.print("abc");
out.println("******");
out.write("张三");
//关闭输出流
out.close();
访问路径的基本原理
相对路径和绝对路径
资源路径和资源名称
路径中最后一个斜杠之前的全是路径 最后一个为资源名称
前台路径与后台路径
前台:html之类的前端路径 作用是查找
后台:java或者xml配置文件 作用是标识
绝对路径=相对路径+参照路径
使用浏览器默认将路径转化为绝对路径
相对路径类型 | 参照路径 | 相对路径转化为绝对路径的完成者 |
---|---|---|
前台路径 | 当前web服务器的根路径http://localhost:8080 | 浏览器 |
后台路径 | 当前web应用的根路径http://localhost:8080/paramy | web服务器 |
以路径名开头 | 当前访问资源的路径 | 浏览器/服务器 |
注意:当你填写路径时候 在路径前添加一个 / 和没有斜杠直接写路径是两码事 当你二者都能满足要求 优先选择加 /
因为加斜杠的路径不会改变时是写死的路径 不加的话可能会发生改变
特例:后台路径重定向时候不能用后台路径 这是因为sendRedirect方法的本质决定的 这个方法可以完成项目资源的跳转 也可以跳转到其他资源所以这个后台路径的参照路径为当前web服务器的根
推荐写法:动态获取
response.sendRedirect(request.getConrtextPath()+"/otherServlet")
三大域属性
从大到小 servletContext>HTTPSession>HTTPSessionRequest
servletcontext 既 application,置入其中的域属性是整个应用范围的 可以完成跨会话共享数据
HTTPSession 置入其中的域属性是会话范围的 可以完成跨请求共享数据
HTTPSessionRequest 置入其中的域属性是请求范围的 可以完成跨servlet共享数据 但这些servlet必须在用一个请求中
对于这三个域属性空间使用原则是 在可以保证功能需求的前提下 优先使用小范围大的 这样不仅可以节省服务器内存 还可以保证数据的安全性