1,定义:
一个小型的java程序,运行在Web服务器,用于接收和响应客户端的http请求
2,测试运行Web工程
A,在Java resource中新建一个类,实现servlet接口
B,配置servlet:
在webContent/WEB-INF/web.xml文件中进行配置:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.summerxia.servlet.HelloServlet</servlet-class>
</servlet>
//注册servlet的映射
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
3,servlet的通用法
Servlet (接口)
|
|
GenericServlet(实现类,父类)
|
|
HttpServlet (用于处理http的请求)(子类)
定义一个类,继承HttpServlet 复写doGet() 和 doPost()
4,servlet的生命周期
生命周期方法——在对象的创建到销毁过程中,一定会执行的方法
A,初始化
init方法
在创建一个servlet实例时,执行此方法
该方法只会在初次访问servlet时,才会执行一次
B,服务
service方法
客户端有请求时,就会执行此方法
客户端每请求一次,此方法执行一次
C,销毁
destroy方法
servlet销毁时,执行此方法
即项目从服务器移除或者正常关闭服务器(shutdown.bat)时,会执行此方法
5,servlet初始化提前
在webContent/WEB-INF/web.xml配置中的标签内添加标签,此标签属性为int类型的数字,数字越小,越早初始化。
6,ServletConfig
A. 未来我们自己开发的一些应用,使用到了一些技术,或者一些代码,我们不会。 但是有人写出来了。它的代码放置在了自己的servlet类里面。
B. 刚好这个servlet 里面需要一个数字或者叫做变量值。 但是这个值不能是固定了。 所以要求使用到这个servlet的公司,在注册servlet的时候,必须要在web.xml里面,声明init-params
ServletContext
context–上下文
每个web工程都只有一个ServletContext对象。 也就是不管在哪个servlet里面,获取到的这个类的对象都是同一个。
如何得到ServletContext对象:
ServletContext context = getServletContext();
ServletContext的作用:
1. 获取全局配置参数
ServletContext context = getServletContext();
String address = context.getInitParameter("key");
-
获取web工程中的资源
A,获取资源在tomcat里面的绝对路径ServletContext context = getServletContext(); String path = context.getRealPath("file/config.properties");
B,获取资源流对象
ServletContext context = getServletContext(); InputStream ips = context.getResourceAsStream("file/config.properties");
-
存取数据,servlet间共享数据 域对象
步骤:1, 定义一个登陆的html页面, 定义一个form表单<body> <form action ="LoginServlet" method ="get"> 用户名:<input type ="text" name ="username"> 密码:<input type ="password" name ="password"> <input type ="submit" value ="登录"> </form> </body>
2,定义一个Servlet,名为LoginServlet.java
重写doGet()和doPost(),在doGet()方法中进行步骤3的操作代码编写3,针对成功或者失败,进行判断,然后跳转到不一样的网页
//通过HttpServletRequest对象request获取参数 String username = request.getParameter("username"); String password = request.getParameter("password"); //通过HttpServletResponse对象response获取输出流 PrintWriter pw = response.getWriter(); //数据校验,并进行相关处理 if("admin".equals(username)&&"123".equals(password)){ //设置状态码 response.setStatus(302);//302--see other //定位跳转的是哪一个html文件 response.setHeader("Location","login_success.html"); //重定向,综合简写 response.sendRedirct("login_success.html"); //该方法将login_success.html返回客户端,再产生一个request访问该地址 //请求转发,写法 request.getRequestDispancher("login_success.html").forward(request,response); //该方法直接同一个request访问login_success.html }else{ pw.writer("login failed..."); }
-
ServletContext 何时创建, 何时销毁?
服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象
从服务器移除托管,或者是关闭服务器。
ServletContext 的作用范围:
只要在这个项目里面,都可以取。 只要同一个项目。 A项目存, 在B项目取,是取不到的
HttpServletRequest–这个对象封装了客户端提交过来的一切数据(key=value形式数据)。
作用:1,可以获取客户端请求头信息
//获取请求头中头信息的头名
Enumeration<String> headerNames = request.getHeaderNames();
//根据头名获取头值
while (headerNames.hasMoreElements()) {
String name = (String) headerNames.nextElement();
String value = request.getHeader(name);
System.out.println(name+"="+value);
}
2,获取客户端提交过来的数据
String name = request.getParameter("name");
String address = request.getParameter("address");
System.out.println("name="+name);
System.out.println("address="+address);
**3,获取的对象,中文乱码现象
GET方式:
原因:tomcat收到了这批数据,getParameter 默认使用ISO-8859-1去解码
处理方法:1,先让文字ISO-8859-1对应的字节数组 , 然后再按utf-8拼接字符串
eg:username = new String(username.getBytes("ISO-8859-1") , "UTF-8");
2,可以在tomcat里面做设置处理 conf/server.xml 加上URIEncoding="utf-8"
POST方式:
处理方法: request.setCharacterEncoding("UTF-8");//此设置必须写在getParameter()之前
eg: request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String address = request.getParameter("address");
HttpServletResponse–负责响应客户端的请求,返回数据给客户端。
作用:
1,输出数据到页面上
A, 以字符流输出–response.getWriter();
//步骤1,指定输出到客户端的时候,这些文字的使用UTF-8编码
response.setCharacterEncoding("UTF-8");
//步骤2,指定浏览器解析数据时,使用UTF-8编码
response.setHeader("Content-Type","text/html;charset=UTF-8");
//获取输出流对象,并输出数据
response.getWriter().write();
B, 以字节流输出–response.getOutputStream()
//步骤1,指定浏览器解析数据时,使用UTF-8编码
response.setHeader("Content-Type","text/html;charset=UTF-8");
//步骤2,指定输出到客户端的时候,这些文字的使用UTF-8编码
response.getOutputStream().write("string".getBytes("UTF-8"));
C, 不管是字节流还是字符流都可以使用的方法
//此方法需定义在数据操作之前
response.setContentType("text/html;charset=UTF-8");
2,下载文件/资源
A, 直接以超链接的方式下载,不写任何代码。 也能够下载东西下来。
原因:tomcat里面有一个默认的Servlet – DefaultServlet 。这个DefaultServlet 专门用于处理放在tomcat服务器上的静态资源。
B, 以底层流的方式进行传输下载
//获取下载对象的文件名
String filename = request.getParameter("filename");
//获取这个文件在tomcat中的绝对路径
String path = getServletContext().getRealPath(filename);
//设置弹框下载
response.setHeader("Content-Disposition","attachment;filename="+filename);
//使用输入流读取文件,并使用输出流进行输出
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len = 0;
byte[] byte = new byte[1024];
while((len = is.read(byte)! = -1){
os.write(byte,0,len);
}
os.close();
is.close();