第四章 Servlet模型(一)

(总结)站点结构

1. 站点结构
站点名称的文件夹:
	WEB-INF:classes(字节码文件)、lib、web.xml
	静态页面(html)或动态资源(JSP)
	
2. web.xml中对Servlet配置
	1)Servlet别名
	2)Servlet被访问的虚拟路径
	<servlet>
		<servlet-name>别名</servlet-name>
		<servlet-class>包含完整包目录的Servlet类</servlet-class>
	<servlet>
	<servlet-mapping>
		<servlet-name>别名</servlet-name>
		<url-patten>虚拟路径</url-patten>
	<servlet-mapping>
	
3. web.xml中welcome-file-list节点:配置服务器运行站点时默认加载的页面,
	查找时顺序查找,直到找到一个为止。



	在地址栏输入信息为:Tomcat服务器地址/站点名称/虚拟路径
4. 虚拟路径配置方法(3种)
	1)完整路径:       /hello  、/abc/hello
	2/目录/ */first/ *
	3*.后缀名:       *.docc
	
5. 根目录:站点根目录(配置的站点文件夹)、源文件根目录(src目录)

6. 常用的类(接口)及方法
	Servlet、GenericServlet、HttpServlet(公有的service、保护的service)
	
HttpServlet中公有service方法的实现:
ServletRequest、ServletResponse——>HttpServletRequest、HttServletResponse


调用do方法(doGet、doPost)
方法:
	请求中的方法:String getParameter(String param)用于获取表单、超链接(href的值不可以有空格,如href=”hello?paramName=paramValue”)
	
	获取输出流:PrintWriter response.getWriter()getOutputStream()(字节流)
Request的Attribute参数:request.setAttribute(String name, String value),request.getAttribute(String name)
编码方式的设置:
setCharacterEncoding(String charset)
响应页面的MIME类型设置:
response.setContentType(“text/html”)   “image/jpg”
response.setContentType(“text/html;charset=utf-8)

7. Servlet实例化时间设置 < load-on-startup>
负数或不设置表示用到时加载;
非负数表示服务器启动后加载;

8. 页面跳转
转发(forward):request.getRequestDispather(String url).forward(request, respond)
重定向(sendRedirect):response.sendRedirect(String url)
两种方式的区别:
1)	速度:请求转发的速度快,请求转发对于用户来说是1次请求,请求重定向对于用户来说是2次请求
2)	地址栏:请求转发时地址栏没变化、请求重定向时地址栏改变
3)	参数共享:请求转发可以共享参数、请求重定向不可以

9. Servlet的生命周期
加载与实例化、初始化、服务(service方法的执行)、销毁
无参构造实例化、init(ServletConfig config)service(ServletRequest,ServletResponse)destroy()
在Servlet生命周期中服务器自动产生了哪些对象:
Servlet本身实例、request、response、config(ServletConfig)、context(ServletContext)

10. 2个特殊的接口,可以用来封装初始化数据
1)ServletConfig:用于封装Servlet的初始化数据
服务器创建的
获取ServletConfig对象:servlet.getServletConfig()
获取初始化数据:config.getInitParameter(String name)
2)ServletContext:用于封装全局的初始化数据
获取ServletContext对象:servlet.getServletContext()、config.getServletContext()
获取初始化数据:context.getInitParameter(String name)
设置/获取全局化参数:setAttribute(String name, String value)getAttribute(String name)

11. 通常使用注解的方式来配置Servlet
别名、虚拟路径、加载时机、初始化参数
@WebServlet(
name=”别名”,
	urlPatterns=”虚拟路径”,
	loadOnStartup=0/-1,    //≥0:服务器启动就加载  负数/不配置:需要的时候加载
	initParams={@WebInitParam(name=”K”, value=”V”), 
@WebInitParam(name=”KEY”, value=”VALUE)
	}
)

12. 作用域
request  Attribute
context  Attribute
*session 会话 Attribute

Servlet(Server Applet)是Java Servlet的简称,是小服务程序或服务连接器,是用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容
在这里插入图片描述

1. 手动编写部署Servlet程序

1. 编写Servlet程序(实现Servlet接口)

在这里插入图片描述

2. 编译Servlet源文件,生成字节码文件

在这里插入图片描述
注意: ① DOS窗口中进入Servlet文件所在目录 ② -cp参数 导入需要的jar包 javac -cp .;lib* Hello.java

3. 部署

– 在Tomcat的webapps目录下创建项目目录
– 在项目目录下创建WEB-INF目录
– 在WEB-INF目录下放置web.xml配置文件、classes目 录和lib目录

    • classes目录中是步骤2中生成的字节码文件
    • lib目录中是用到的jar包

在这里插入图片描述

4. 运行

– 启动Tomcat
– 访问Servlet
在这里插入图片描述

在这里插入图片描述







2. Eclipse开发Servlet

• 新建类,实现Servlet接口
• 新建Servlet(继承HttpServlet)
在这里插入图片描述
使用Eclipse生成的Servlet

    1. 新建工程,自动生成web.xml配置文件
    1. 新建包并在包下新建Servlet
    1. 在配置文件中配置Servlet
      在这里插入图片描述
      地址栏输入;Tomcat服务器 + 站点名称 + 虚拟路径
      到达服务器,解析URL
      拿到路径与web.XML文件
      找到虚拟路径对应的类别名
      根据servlet-name占到真实路径与文件
      访问文件,自动占用Servlet的service()方法,response参数返回响应

3. 实现service的方法有三种

  1. 实现service接口
  2. 继承GenericService接口(不推荐)
  3. 继承Httpservice

都需要对创建的service类进行配置,配置访问的虚拟路径(web.xml)
在这里插入图片描述

第三种方法实现Servlet

在这里插入图片描述

4. 虚拟路径配置三种方法

1. 完整的URL虚拟路径      :/hello
2. /目录/ *
3. *.ext  后缀名方式(自定义后缀)

第二种举例;

/abc/ *
匹配的URL(用户输入的URL)
举例:    xxx/站点/abc/xxx     xxx/站点/abc        两个都可以
abc后面无所谓,但是前面必须是站点
	<url-pattern>    /hello/*   </url-pattern>

第三种举例

 *.lww    *.自定义
 只要虚拟路径最后字符满足lww就可以.
	<url-pattern>  *.hello  </url-pattern>

总结

左斜杠代表的是站点的根目录.
虚拟路径配置不仅仅限制一个,但是一种路径不能配给多个servlet,但是servlet可以有多个.
在这里插入图片描述







常用请求方法

GET     调用doget
POST	调用dopost
DELETE    
TRACT

在这里插入图片描述
httpservlet继承genericservlet
genericservlet实现servlet接口

在这里插入图片描述







请求与响应:

在这里插入图片描述

注册就是加载
创建就是创建对象

在这里插入图片描述

请求到达时:服务器自动产生两个对象,请求与响应

在这里插入图片描述

两个对象已参数形式传入,封装成新的HttpServlet

在这里插入图片描述

关联输出流(printwriter)对象或者字节流对象

在这里插入图片描述

封装数据给服务器,由服务器再处理,发送给浏览器

创建网页文件

在这里插入图片描述

接受请求

在这里插入图片描述

强制转型,
getParament(); 获取表单中的属性值
get/set Attribute(); 设置/获取 参数的数值
此方法只适用于HttpServlet,在普通Servlet使用时会发生强制转换

在这里插入图片描述

 Attribute() 方法只适用于HttpServlet,在普通Servlet使用时会发生强制转换

在这里插入图片描述

在这里插入图片描述

  <servlet>
  	<servlet-name>FakeName1</servlet-name>
  	<servlet-class>onest.lww.NormalServlet</servlet-class>
  </servlet>
  
  
  <servlet-mapping>
	<servlet-name>FakeName1</servlet-name>
	<url-pattern>/normal</url-pattern>
  </servlet-mapping>  









<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	action参数是表单的提交位置,应写目标的虚拟路径
	问号后面的num是自定义参数,数值是等号后面的数据
	默认表单提交方式是get方式给,post方法会自动调用get方法。
	推荐post方法,get不安全。
	
	<form action="hello" method="post">     
		<input name="uName" type="text"><br/>
		<input type="submit" value="Submit">
	</form>
</body>
</html>










	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("111111111111");
		//获得请求参数
		String parma=request.getParameter("uName");
		//添加Attribute参数信息
		request.setAttribute("pwd", "123456");
		//获得PrintWriter对象
		PrintWriter writer=response.getWriter();
		//获取Attribute参数的值
		String pwd=(String) request.getAttribute("pwd");//需要强制转换
		//向客户端返回获取到的表单参数
		writer.write(parma);
		//在控制台输出添加的Attribute参数
		System.out.println(pwd);
	}



页面的两种传递/跳转方式(转发/重定向)

在这里插入图片描述

request.getDequestDispatcher 请求转发
response.secdRedirect 请求重定向

在这里插入图片描述
请求转发可以实现数据的共享

设置编码方式
确定表单数据的返回类型
请求转发

@WebServlet("/forw")//参数是默认的虚拟路径
---
Forwarg:


		//设置请求的编码方式
		request.setCharacterEncoding("utf-8");
		//设置返回的相应数据的编码方式,返回页面类型
		//response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");//页面返回类型与数据方式
		/MIME类型,第二种常用。


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取表单参数
		String uName=request.getParameter("uName");
		System.out.println(uName);
		//添加Attribute参数
		request.setAttribute("pwd", "123456");
		//转发请求
		request.getRequestDispatcher("targ")
						.forward(request,response);
						//include替换forward的话,会导致此页面与最终页面的数据一起返回给客户端。
	}










@WebServlet("/targ")
---
Target:
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取传递过来的表单参数与Attribute参数
		String uName=request.getParameter("uName");
		String pwd=(String)request.getAttribute("pwd");
		//获取Attribute参数
		PrintWriter writer=response.getWriter();
		//向客户端返回数据
		writer.write(uName);
		writer.write("<br/>");
		writer.write(pwd);
	}

请求传递/请求重定向

@WebServlet("/red")


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取表单参数
		String uName=request.getParameter("uName");
		System.out.println(uName);
		//添加Attribute参数
		request.setAttribute("pwd", "123456");
		//重定向页面(请求)
		response.sendRedirect("targ");
无法打印或者显示null
因为请求是重定向过来的,表单的参数是无法传递过来的。
	}


图片传递与加载
@WebServlet("/img")

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//字节流读取本地图片
		//读取服务器本地图片(获取本地文件输入流)
		InputStream in=new FileInputStream("C:\\Users\\yxmia\\Desktop\\123.png");
		//设置数据的返回方式
		response.setContentType("image/ipeg");
		//图片返回浏览器(网络输出流)
		OutputStream out=response.getOutputStream();
		//循环读写
		int b=-1;
		while((b=in.read())!=-1) {
			out.write(b);
		}
	}


在这里插入图片描述

get与Post区别(面试)

  1. get请求方式不安全,传输的数据参数放在了地址栏的URL中,post相对安全,参数不在URL中,隐含传输。

  2. get请求的数据量比较小,受限与URL的长度大小。
    post的传输量比较大,一般没有限制。

  3. 默认采用的是Get请求方式,请求方式比post高

  4. get请求数据集支持Ascll编码,post支持ISO10646字符集

  5. 一般页面采用编码方式是ISO-8859-1

猜你喜欢

转载自blog.csdn.net/qq_44627608/article/details/105539476