【Servlet01】Servlet配置和使用
将项目发布到服务器中
- eclipse:存到tomcat的wtpwebapps文件夹下
- myeclipse:存到tomcat的webapps文件夹下
Servlet
- 就是一个java程序运行在web服务器上,用于接收和响应客户端的http请求
- 更多的是配合动态资源来做,静态资源也要用到servlet,不过tomcat已经定义好了一个defaultServlet
手动配置servlet
- 新建一个类实现servlet接口
- 配置servlet,(目的告诉服务器有这样的servlet
– 在webinf下的web.xml(若没有这个下次新建项目时记得最后一步勾选)
注册servlet:向tomcat报告有个一名字叫xxxx的servlet,具体的路径是xx.xxx.xxx.xxx
<servlet>
<servlet-name>HelloServelt</servlet-name>
<servlet-class>com.zd.ser.HelloServelt</servlet-class>
</servlet>
注册servlet的映射:servlet-name:找到上面注册的具体servlet,url-pattern:在地址栏上的路径。(不要忘记前面有一个反斜杠)
<servlet-mapping>
<servlet-name>HelloServelt</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
可以添加初始化参数 —— param
<servlet>
<servlet-name>servlet03</servlet-name>
<servlet-class>com.zd.ser.Servlet03</servlet-class>
<init-param>
<param-name>address</param-name>
<param-value>hahahha</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servlet03</servlet-name>
<url-pattern>/servlet03</url-pattern>
</servlet-mapping>
通用servlet写法
- 继承httpservlet用doGet( ),doPost( ),不用再写service方法由于继承的httpservlet类中有此方法并做了post/get方法的判断
servlet声明周期
- 1.init()
创建servlet实例时执行
一个servlet只初始化一次,此方法只执行一次
默认下,初次访问servlet才会创建实例 - 2.service()
客户端发来请求时执行
可以执行多次,一次请求对应一次 - 3.destroy()
销毁servlet时执行
1)项目从tomcat中移除
2)正常关闭tomcat,(打开shutdown.bat)
让servlet创建实例提前
1.默认情况下首次访问时才会执行init,若准备初始化工作比较耗时,会在init方法逗留过久。
2.解决方法:在注册servlet时配置load-on-startup数字越小启动的时间越早(从2开始)
<servlet>
<servlet-name>servlet02</servlet-name>
<servlet-class>com.zd.ser.Servlet02</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servlet02</servlet-name>
<url-pattern>/servlet02</url-pattern>
</servlet-mapping>
获得servlet信息 —— ServletConfig
- 通过这个对象可以得到servlet初始化信息
public class Servlet03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//【得到servlet的配置信息】
ServletConfig config = getServletConfig();
//【获取到配置servlet里面的 servlet-name 的文本内容】
String servletName = config.getServletName();
//【获取初始化参数】
String initParameter = config.getInitParameter("address");
//【获取所有的初始化参数name】
Enumeration<String> names = config.getInitParameterNames();
while (names.hasMoreElements()) {
String string = (String) names.nextElement();
//【获取所有的初始化参数value】
String parameter = config.getInitParameter(string);
System.out.println(parameter);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
为什么要有servletConfig
- 开发时使用一些应用,用到了其他人的代码,这个代码放置在servlet中
- 刚好这个servlet里面需要一个数字或者变量值,但是不能固定,所以要使用到这个servlet的项目,在注册servlet时,必须要在web.xml里面声明init-params
- servlet会被封装成一个jar包(jar包就是编译了的class的压缩文件)
- 将jar包放到webinf的lib下
手动配置servlet
- 全路径匹配: /开始
- 路径匹配:/开始 *结束 (通配符
- 以拓展名匹配:*.XXX
ServletContext
- servlet上下文
- 每个web工程只有一个ServletContext
作用:1.取全局配置参数
<!-- 配置全局参数 -->
<context-param>
<param-name>address</param-name>
<param-value>aaa</param-value>
</context-param>
ServletContext context = getServletContext();
String string = context.getInitParameter("address");
System.out.println(string);
作用:2.可以获取资源文件
getRealPath
- 先得到路径自己new inputstream
//【获取ServletContext对象】
ServletContext context = getServletContext();
//【得到的是项目在romcat里面的根目录,获取给定文件在服务器上面的绝对路径】
String path = context.getRealPath("file/context.properties");
//【1、创建属性对象】
Properties properties = new Properties();
//【2、指定输入的数据源】
InputStream is = new FileInputStream(path);
properties.load(is);
//【3、获取属性值】
String address = properties.getProperty("address");
getResourceAsStream
- 直接给相对路径获取流对象
//【获取ServletContext对象】
ServletContext context = getServletContext();
//【获取web工程下的资源,转化成流对象,前面隐藏当前工程目录】
InputStream is = context.getResourceAsStream("file/config.properties");
//【1、创建属性对象】
Properties properties = new Properties();
properties.load(is);
//【3、获取属性值】
String name = properties.getProperty("name");
System.out.println(name);
is.close();
作用3:存取数据,servlet间共享数据,域对象
发送数据给servlet——form表单
- 注意:form中action中填写的是web.xml中的url-pattern
获取请求信息request
获取数据request.getParameter
响应请求信息response
- 状态码,3xx重新跳转定位:response.setStatus(3xx);
- 跳转到另一个页面:response.setHeader(location,class名)
- 取之前的成功次数getServletContext().getAttribute(“属性名”,值);【添加为空判断】
- 成功次数累加getServletContext().setAttribute(“属性名”,值);
- 多个servlet数据共享
何时创建?何时销毁?
- 服务器启动,会为托管的每一个web应用程序创建一个servletContext对象
- 从服务器移除托管,或关闭服务器
作用范围
- 只要在同一个项目中就能取到
HttpServletRequest
- 封装了客户端的数据
- request.getHeaders()
得到一个(Enumeration)枚举集合,里面都是key: - request.getHeader(“key名”)
得到对应key的值 - request.getParameter(“属性名”);
客户端提交的数据 - request.getParameterMap();
得到所有的值为map集合
map集合遍历:Set<> set = map.keySet(); Iterator<> iterator = set.iterator(); while(irerator.hasNext())
中文乱码问题
- 客户端数据给服务端,中文可能会出现乱码
get方式
- get请求过来的数据在url就已经编过码了取到的就是乱码
- Tomcat受到数据,getParameter默认使用ISo-8859-1来解码
- 先让数据回到ISo-8859-1的字节数组,再用utf-8解码
- new String(xxx.getBytes(“ISo-8859-1”),“utf-8”)
- response.setContentType(“text/html;charset=utf-8”);
post方式
- 1.设置一下tomcat文件夹下
servlet.xml urlEncoding设置成utf-8 - 2.设置请求体的编码
取数据之前request.setCharacterEncoding("utf-8 ")
对于get方法不好用,因为get的数据都在url中,并不在请求体里
HttpServletResponse练习:下载资源
直接以超链接的方式下载
- 原因tomcat里有默认的Servlet – DefalutServler这个servlet专门用于处理放在tomcat服务器上的静态资源
自己手动写下载
- 获取文件流
- 让浏览器收到这份资源时用下载的方式给用户
- response头中加入”context-disposition“,”attachment;filename="