文章目录
(总结)站点结构
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
-
- 新建工程,自动生成web.xml配置文件
-
- 新建包并在包下新建Servlet
-
- 在配置文件中配置Servlet
地址栏输入;Tomcat服务器 + 站点名称 + 虚拟路径
到达服务器,解析URL
拿到路径与web.XML文件
找到虚拟路径对应的类别名
根据servlet-name占到真实路径与文件
访问文件,自动占用Servlet的service()方法,response参数返回响应
- 在配置文件中配置Servlet
3. 实现service的方法有三种
- 实现service接口
- 继承GenericService接口(不推荐)
- 继承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区别(面试)
-
get请求方式不安全,传输的数据参数放在了地址栏的URL中,post相对安全,参数不在URL中,隐含传输。
-
get请求的数据量比较小,受限与URL的长度大小。
post的传输量比较大,一般没有限制。 -
默认采用的是Get请求方式,请求方式比post高
-
get请求数据集支持Ascll编码,post支持ISO10646字符集
-
一般页面采用编码方式是ISO-8859-1