【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="
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值