Servlet学习

Servlet在web.xml中的基本配置

//servlet在web.xml中的基本配置
<servlet>
<servlet-name>创建的servlet的名字</servlet-name>
<servlet-class>对应的包名+名字</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>对应的servlet名字</servlet-name>
<url-pattern>访问路径</url-pattern>
</servlet-mapping>

Servlet的访问路径

协议名://地址:端口号/工程名/url-pattern

Servlet基本方法

  1. response.getWriter();方法获得一个打印流,可以将数据打印到浏览器。
  2. request.getRemoteAddr();方法获得请求连接的主机的IP地址。
  3. request.getParameter(“参数名”);获得根据参数名获得参数,返回值为String。 若想获得其他类型的参数,获得的String类型参数转化即可
  4. request.setCharacterEncoding(“UTF-8”);方法设置请求字符编码为UTF-8(针对post请求设置的是HTTP协议文本)
  5. response.setCharacterEncoding(“UTF-8”);方法设置相应字符编码为UTF-8(针对post请求设置的是HTTP协议文本)
  6. request.getParameterValues(“参数名称”);方法获得请求参数中名字相同,却有很多个值的情况,返回值为String[]
  7. request.getParameterNames();方法,获得请求参数中的参数名称列表,返回值为Enumeration类型。(可以zai 获取多选框checkbox的值的时候使用)
  8. request.getParameterMap();方法,获得请求参数中的所有键值对。返回值为Map类型

乱码问题

能设置字符编码的几个地方

一些例子程序

简单登录

使用了HTML和Servlet
这里写图片描述

这里写图片描述
以上代码没有考虑到,
1,字符编码格式的问题
2,用户提交值为null的情况
3,提交方法没有设置,将默认为get方法

ServletConfig与Context对象详解

此部分是转发的博客上的文章

ServletConfig与ServletContext对象详解
一、ServletConfig对象
在Servlet的配置文件中,可以使用一个或多个标签为servlet配置一些初始化参数。(配置在某个servlet标签或者整个web-app下)
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
首先,需要创建私有变量:private ServletConfig config = null;
其次,要重写init方法,传入config,令this.config = config;从而获得ServletConfig对象
最后,就可以获得中的配置信息了
//获取初始化参数
String value1 = this.config.getInitParameter(“x1”);
//获得配置文档中标签下name对应的value
String vlaue2 = this.config.getInitParameter(“x2”);

//2.获取所有的初始化参数(用Enumeration接收)
Enumeration e = this.config.getInitParameterNames();
while(e.hasMoreElements()){
String name = (String) e.nextElement();
String value = this.config.getInitParameter(name);
System.out.println(name + “=” + value);
}
在开发中ServletConfig的作用有如下三个:
1)获得字符集编码
String charset = this.config.getInitParameter(“charset”);
2)获得数据库连接信息
String url = this.config.getInitParameter(“url”);
String username = this.config.getInitParameter(“username”);
String password = this.config.getInitParameter(“password”);
3)获得配置文件
String configFile = this.config.getInitParameter(“config”);

二、ServletContext对象
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
1)ServletContext对象应用1:多个web组件之间使用它实现数据共享
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
在serlvet中,可以使用如下语句来设置数据共享
ServletContext context = this.getServletContext(); //servletContext域对象
context.setAttribute(“data”, “共享数据”); //向域中存了一个data属性
在另一个servlet中,可以使用如下语句来获取域中的data属性
ServletContext context = this.getServletContext();
String value = (String) context.getAttribute(“data”); //获取域中的data属性
System.out.println(value);
2)通过servletContext对象获取到整个web应用的配置信息
String url = this.getServletContext().getInitParameter(“url”);
String username = this.getServletContext().getInitParameter(“username”);
String password = this.getServletContext().getInitParameter(“password”);
3)通过servletContext对象实现servlet转发
由于servlet中的java数据不易设置样式,所以serlvet可以将java数据转发到JSP页面中进行处理
this.getServletContext().setAttribute(“data”,”serlvet数据转发”);
RequestDispatcher rd = this.getServletContext().getRequestDispatcher(“/viewdata.jsp”);
rd.forward(request, response);
4)通过servletContext对象读取资源文件
在实际开发中,用作资源文件的文件类型,通常是:xml、properties,而读取xml文件必然要进行xml文档的解析,所以以下例子只对properties文件进行读取(在一个web工程中,只要涉及到写地址,建议最好以/开头)
在web工程中,我们一般来说,是不能采用传统方式读取配置文件的,因为相对的是jvm的启动目录(tomcat的bin目录),所以我们要使用web绝对目录来获取配置文件的地址
读取资源文件的三种方式:
第一种:使用ServletContext的getResourceAsStream方法:返回资源文件的读取字节流
InputStream in = this.getServletContext().getResourceAsStream(“/WEB-INF/classes/db.properties”);
Properties prop = new Properties();
prop.load(in);
String url = prop.getProperty(“url”);
第二种:使用ServletContext的getRealPath方法,获得文件的完整绝对路径path,再使用字节流读取path下的文件
String path = this.getServletContext().getRealPath(“/WEB-INF/classes/db.properties”);
String filename = path.substring(path.lastIndexOf(“\”)+1);
//相比第一种方法的好处是:除了可以获取数据,还可以获取资源文件的名称
FileInputStream in = new FileInputStream(path);
Properties prop = new Properties();
prop.load(in);
String url = prop.getProperty(“url”);
第三种:使用ServletContext的getResource方法,获得一个url对象,调用该类的openStream方法返回一个字节流,读取数据
URL url = this.getServletContext().getResource(“/WEB-INF/classes/db.properties”);
InputStream in = url.openStream();
Properties prop = new Properties();
prop.load(in);
String url1 = prop.getProperty(“url”);
5)web工程中,不同位置的资源文件的读取方式
一、当资源文件在包下面时
InputStream in = this.getServletContext().getResourceAsStream(“/WEB-INF/classes/cn/itcast/context/db.properties”);
System.out.println(in);

二、资源文件在web-inf下
in = this.getServletContext().getResourceAsStream(“/WEB-INF/db.properties”);
System.out.println(in);

三、资源文件在web工程中
in = this.getServletContext().getResourceAsStream(“/db.properties”);
System.out.println(in);
6)在非servlet程序中如何读取配置文件:用类装载器
1)用类装载方式读取
in = StudentDao.class.getClassLoader().getResourceAsStream(“cn/itcast/context/db.properties”);
2)用类装载方式读取,把资源当作url对待
URL url = StudentDao.class.getClassLoader().getResource(“db.properties”);
这样可以获得资源文件名称:String path = url.getPath();
3)注意:在线程休眠过程中,即使改动了资源文件,获取到的还是原始内容
解决方案:
URL url = StudentDao.class.getClassLoader().getResource(“db.properties”);
String path = url.getPath();

FileInputStream in = new FileInputStream(path);
Properties prop = new Properties();
prop.load(in);
System.out.println(prop.getProperty(“url”));

try {
Thread.sleep(1000*15);
} catch (InterruptedException e) {
e.printStackTrace();
}
in = new FileInputStream(path);
prop = new Properties();
prop.load(in);
System.out.println(prop.getProperty(“url”));

4)注意:用类装载器读取资源文件时,千万要注意,资源文件绝对不能太大,否则极易导致内存溢出

servlet生命周期

此部分转发于csdn的用户,“繁华落叶草”的原创文章
servlet的生命周期
1 什么是生命周期?
生命周期表示一个Java对象从最初被创建到最终被销毁经历的所有过程
2 Servlet对象的生命周期谁来管理?程序员可以干涉么?
Servlet对象的生命周期,javaweb程序员无权干涉,包括Servlet对象的相关方法的调用,javaweb
程序员也是无权干涉的
Servlet对象从最初的创建,方法的调用以及对象的销毁整个过程有WEB容器来管理。
Web Container管理Servlet对象的生命周期。
3 “默认情况下”,Servlet对象在WEB服务器启动阶段不会实例化。【若希望在WEB服务器启动阶段实例化Servlet对象,需要进行特殊设置】
4 描述Servlet对象生命周期
1)用户在浏览器地址栏上输入URL:http://localhost:8080/prj.servlet-03/testLifeCycle
2)web容器截取请求路径:/prj.servlet-03/testLifeCycle
3)web容器在容器上下文中找请求路径/prj.servlet-03/testLifeCycle对应的Servlet对象
4)若没有找到对应的Servlet对象
4.1)通过web.xml文件中相关文件的配置信息,请求得到路径/testLifeCycle对应的Servlet完整类名
4.2)通过反射机制,调用Servlet类的无参数构造函数方法,完成Servlet实例化
4.3)web容器调用Servlet对象的init方法完成初始化操作
4.4)Web容器调用Servlet对象的service方法提供服务
5)若找到对应的Servlet对象
5.1)web容器直接调用Servlet对象的service方法提供帮助
6)web容器关闭的时候/webApp重新部署的时候/该Servlet对象长期没有对象用户再次访问时,Web容器会将Servlet对象
销毁,在销毁该对象之前,Web容器会调用Servlet对象的destroy方法,完成销毁之前的准备。
5 总结:
5.1 Servlet类的构造方法只执行一次
5.2 Servlet对象的init方法只执行一次
5.3 Servlet对象的service方法用户请求一次,则执行一次
5.4 Servlet对象的destroy方法只执行一次
6 注意:
init方法执行的时候,Servlet对象已经被创建好了。
destroy方法执行的时候,Servlet对象还没有被销毁,即将被销毁。
7 Servlet对象是单例,但是不符合单例模式。真单例的构造方法是私有化的,tomcat服务器支持多线程。
所以Servlet对象在单实例多线程的环境下运行。那么Servlet对象中若有实例变量,并且实例变量涉及
修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用
局部变量。
8 若希望在web容器启动阶段实例化Servlet对象,需要在web.xml中进行相关配置。例如:

 <servlet>
 <servlet-name>welcomeServlet</servlet-name>
     <servlet-class>com.bjpowernode.javaweb.servlet.WelcomeServlet</servlet-class>
  <load-on-startup>0</load-on-startup>
 </servlet>
 <servlet-mapping>
 <servlet-name>welcomeServlet</servlet-name>
 <url-pattern>/welcome</url-pattern>
 </servlet-mapping>
        <load-on-startup>0</load-on-startup>中间的自然数越小优先级越高。

9 Servlet对象实例化之后,这个Servlet对象被存储在哪里?
大多数的WEB容器都是将该Servlet对象以及对应的URL-pattern存储到map集合中了。
在WEB容器中有这样一个Map集合
Map <String,Servlet>集合
key value
—————————–
/login LoginServlet对象的调用
/delete DeletServlet对象引用
/save SaveServlet对象引用
10 服务器在启动的时候就会解析各个webApp的web.xml文件,做了什么?
将web.xml文件中的url-pattern和对应的Servlet完整类名存储到Map集合中了:
在Map<String,String> 集合
Key value
—————————————
/login com.bjpowernode.javaweb.servlet.LoginServlet
/delete com.bjpowernode.javaweb.servlet.DeleteServlet
…….
11 Servlet接口这些方法中编写什么代码?什么时候使用这些方法?
1)无参数构造方法【以后不考虑构造函数论,尽量别动构造函数】
2)init方法
以上两个方法执行时间几乎相同,执行次数都以一次,构造方法执行的时候对象正在创建,init方法执行时,对象已经创建:
若系统要求在对象创建时刻执行一段特殊的程序,这端程序尽量卸载init方法中
为什么不建议将代码编写到构造函数中呢?
存在风险,当程序员编写构造方法的时候,可能会导致无参数构造方法不存在。
一个类不编写任何构造函数,默认有一个无参数的构造方法,但是一旦编写有参数的构造方法之后,系统
则不在提供无参数构造函数。
Servlet中的init方法是sun送死为javaweb程序员专门提供的一个初始化时刻,
若希望初始化时刻执行一段特殊的程序,这个程序可编写到inti方法,将会被自动调用
3)service方法
这个方法必然要重写,因为在这个方法需要完成业务逻辑的处理,请求的处理,以及完成响应。
而且这个方法中的代码最优价值。
也是最难编写的,最难编写的就是业务代码。
4)destroy方法
这个方法也是SUN公司为javaweb程序员提供的一个特殊的时刻,这个特殊的时刻被称为对象销毁时刻,
若希望在销毁时刻执行一段特殊的代码,需要将这段程序编写到destroy方法中,将会被自动调用
类加载时刻,代码编写在哪里?
静态代码块中
结论:
sun公司为我们程序员提供了很多个不同时刻 ,若要在这个特殊的时刻执行特殊程序,这些程序是有位置编写的。

获取表单参数

HttpServletRequest类
1,getParameter();//指定请求参数名称来取得对应的值。
2,getParameterValues();//获取请求中所有的请求参数的值列表
3,getParameterNames();//获取请求中所有的请求参数的名字列表
4,getParameterMap();//获取请求中所有的请求Key-Value对(参数名称-参数值)

请求转发,传递参数

请求转发是指将请求再转发到另一资源(一般为JSP或Servlet)。此过程依然在同一个请求范围内,转发后浏览器地址栏内容不变
请求转发使用RequestDispatcher接口中的forward()方法来实现,该方法可以把请求转发到另外一个资源,并让该资源对浏览器的请求进行响应

RequestDispatcher rd = request.getRequestDispatcher(path);
rd.forward(request,response);
或request.getRequestDispatcher(path) .forward(request,response);

两类想结合,Servlet能将参数传给另一个Servlet也能传给Jsp
RequestDispatcher类
1,include();//可以将另一个Servlet的操作流包含至当前servlet操作流程中。
2,forward();//将请求处理转发给另一个servlet,当前servlet不能含有任何的请求响应。
HttpservletRequest类
1,setAttribute(String key,String value);//指定名称与对象设置属性。
2,getAttribute(String ket);//指定名称取得属性。
3,getAttributeNames();//取得所有属性名称。
4,removeAttribute(String key);//指定名称移出属性。

重定向,传递参数

重定向是指页面重新定位到某个新地址,之前的请求失效,进入一个新的请求,且跳转后浏览器地址栏内容将变为新的指定地址
重定向是通过HttpServletResponse对象的sendRedirect()来实现,该方法相当于浏览器重新发送一个请求

HttpServletResponse类
response.sendRedirect(path);
因为重定向就相当于重新发送了一个请求,所以传递重定向的方式传递参数应该是在请求头中设置参数。

路径

1,得到工程目录:request.getSession().getServletContext().getRealPath(“”) 参数可具体到包名。
结果:E:\Tomcat\webapps\TEST
2,得到IE地址栏地址:request.getRequestURL()
结果:http://localhost:8080/TEST/test
3,得到相对地址:request.getRequestURI()
结果:/TEST/test

通过以上方法可以查看当前路径是什么,然后就可以选择正确的相对路径了
当前目录:.
上级目录:..
要选择上级目录的test文件:../test 或 ..\test

servlet解释

一个Servlet程序就是一个实现了javax.servlet.Servlet接口的java类,Servlet接口定义了Servlet引擎与Servlet程序之间通信的协议约定。
javax.servlet.GenericServlet实现了Servlet接口,它实现了Servlet程序的基本特征和功能。抽象类,需要子类完成service。
jacax.servlet.http.HttpServlet是GenericServlet的子类,它在GenericServlet类的基础上进行了一些针对HTTP特点的扩充。

Servlet接口说明
1,init(ServletConfig):void
2,getServletConfig():ServletConfig
3,service(ServletRequest,ServletResponse):void
4,getServletInfo():String
5,destory():void

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值