JavaWeb(一)Servlet技术
Servlet
- 一、Servlet
- 1.理解Servlet
- 2.Servlet生命周期、配置及使用
- 3.Servlet继承图
- 4.ServletConfig类
- 5.ServletContext类
- 6.HttpServletRequest类
- (1)请求转发
- (2)base标签
- (3)请求重定向
- 7.HttpServletResponse类
- (1)输出流
- (2)JavaEE三层架构
- 二、HTTP协议
- 1.GET请求
- 2.POST请求
- 3.响应
- 4.MIME类型
- 三、Junit使用
提示:以下是本篇文章正文内容,下面案例可供参考
一、Servlet
1.理解Servlet
运行在Java服务器的,用来处理request与response的小程序
2.Servlet生命周期、配置及使用
生命周期:
public class Servlet01 implements Servlet {//实际创建时,继承HttpSetvlet
// 创建Servlet对象实例
public Servlet01() {
System.out.println("1 构造器方法");
}
//服务器开启后第一次初始化访问时执行
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 ini初始化方法");
}
//每次访问都会执行
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3 service方法,每次访问都会执行");
}
//服务器停止,Servlet销毁时执行
public void destroy() {
System.out.println("退出销毁时执行");
}
//获取Servlet配置
public ServletConfig getServletConfig() { return null; }
public String getServletInfo() { return null; }
}
配置:
<servlet>
<!--定义一个Servlet-->
<servlet-name>Servlet01</servlet-name> <!--Servlet程序别名-->
<servlet-class>chong.Servlet01</servlet-class>
</servlet>
<servlet-mapping>
<!--给Servlet配置一个访问地址-->
<servlet-name>Servlet01</servlet-name>
<url-pattern>/servlet01</url-pattern>
</servlet-mapping>
3.Servlet继承图
4.ServletConfig类
作用:
1.获取Servlet程序的别名 servlet-name的值
2.获取初始化参数 init-param
3.获取ServletContext对象
Servlet配置:
<servlet>
<!--定义一个Servlet-->
<servlet-name>Servlet01</servlet-name> <!--Servlet程序别名-->
<servlet-class>chong.Servlet01</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
Servlet常用方法:
public void init(ServletConfig servletConfig) throws ServletException {
// 1.获取Servlet程序的别名 servlet-name的值
System.out.println("Servlet01的别名为: " + servletConfig.getServletName());
// 2.获取初始化参数 init-param
System.out.println("初始化参数username的值为:" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数password的值为:" + servletConfig.getInitParameter("password"));
// 3.获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
提示:当继承HttpServlet类后,再重写init方法时,需要调用super(config)方法,不然子类无法获得ServletConfig对象
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public ServletConfig getServletConfig() {
return this.config;
}
5.ServletContext类
ServletContext是一个接口,一个工程只有一个ServletContext对象实例,他表示Servlet上下文的域对象(能存取数据的对象),在工程部署时创建
域对象方法 setAttribute() getAttribute() removeAttribute()
作用:
1.获取web.xml中配置的上下文参数context-param
2.获取当前的工程路径, 格式:/工程路径
3.获取工程部署在服务器上的绝对路径
4.可存取数据
实例:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext sc = getServletContext();
// 1.获取web.xml中配置的上下文参数context-param
System.out.println("context-param参数的值为:" + getServletContext().getInitParameter("name"));
// 2.获取当前的工程路径, 格式:/工程路径
System.out.println("当前工程路径:" + sc.getContextPath());
// 3.获取工程部署在服务器上的绝对路径
System.out.println("工程绝对路径:" + sc.getRealPath("/"));
System.out.println("工程绝对路径:" + sc.getRealPath("/public/01.jpg"));
// "/" 被服务器解析为 http://ip:port/工程名/ 映射到IDEA中的web目录
// "/"被浏览器解析为 http://ip:port/
// 4.可存取数据
sc.setAttribute("key1","value1");
System.out.println("获得的值:" + sc.getAttribute("key1"));
sc.removeAttribute("key1");
System.out.println("获得的值:" + sc.getAttribute("key1"));
}
6.HttpServletRequest类
注意:在获取post请求中文参数时默认会乱码, 解决方式:获取请求所有参数之前request.setCharacterEncoding(“utf-8”);
将每一次的请求信息解析封装到Requst对象中,并传给service方法的(doGet和doPost)中
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("URI===>>" + request.getRequestURI()); //获取资源路径 /webtest/servlet02Auto
System.out.println("URL===>>" + request.getRequestURL()); //获取请求的统一资源定位符(绝对路径) http://localhost:8080/webtest/servlet02Auto
System.out.println("客户端 ip地址===>>" + request.getRemoteHost()); //获取客户端IP地址 0:0:0:0:0:0:0:1 IPv6
System.out.println("请求头User-Agent ===>>" + request.getHeader("User-Agent")); //代理(浏览器) Mozilla/5.0
System.out.println("请求方式 ===>>" + request.getMethod()); //请求方式 GET
//获取参数
System.out.println("姓名:" + request.getParameter("username"));
System.out.println("兴趣爱好:" + Arrays.asList(request.getParameterValues("hobby"))); //复选框获取多个值
}
(1)请求转发
只是一次请求,共享请求域中的数据,可以转发到WEBz-INF目录下,不能转发到外部资源
图示理解:
代码:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getParameter("username"));
req.setAttribute("key1","value1");
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet01"); // 获取调度对象
requestDispatcher.forward(req,resp); //(携带请求与响应对象)进入调度地址
}
(2)base标签
当没有base标签时,本页的相对路径参照浏览器地址栏中的地址
base标签,改变本页相对路径参考的路径
<base href="http://localhost:8080/WebTestA" />
(3)请求重定向
两次请求,不共享请求对象域资源。
图示理解:
代码实现:
//法一:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("曾到此一游!Servlet01");
//设置响应状态码,表示重定向
resp.setStatus(302);
//设置重定向的地址
resp.setHeader("Location","http://localhost:8080/webtest/servlet02Auto");
//法二(推荐):
resp.sendRedirect("http://www.baidu.com");
}
7.HttpServletResponse类
通过HttpServletResponse对象来设置响应信息
(1)输出流
字节流 getOutputStream(); 常用于下载(传递二进制文件)
字符流 getWriter(); 常用于回传字符串(常用)
使用时,只能选择一个
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码:
// 法一:
// System.out.println(resp.getCharacterEncoding()); //ISO-8859-1
// resp.setCharacterEncoding("UTF-8"); //设置服务器响应使用的字符集
//
// //将响应的内容信息(包括字符集信息)放入响应头中告诉浏览,然后浏览器按对应的字符集解析该字符串
// resp.setHeader("Content-Type","text/html;charset=UTF-8");
// 法二:
resp.setContentType("text/html;charset=UTF-8"); //在获取流对象之前才有效
System.out.println(resp.getCharacterEncoding()); //ISO-8859-1
PrintWriter writer = resp.getWriter();
writer.write("江江最帅 content!!!");
}
(2)JavaEE三层架构
图示理解:
二、HTTP协议
常见响应码:200 302(重定向) 404 500
1.GET请求
格式:
1.请求行
(1) 请求方式 GET
(2) 请求资源路径[+?+请求参数]
(3) 请求协议域版本号 HTTP/1.1
2.请求头
key:value
图示:
2.POST请求
格式:
1.请求行
(1) 请求方式 GET
(2) 请求资源路径[+?+请求参数]
(3) 请求协议域版本号 HTTP/1.1
2.请求头
key:value
空行
3.请求体 ===>> 发送给服务器的数据
图示:
3.响应
格式:
1.响应行
(1)响应的协议域版本号
(2)响应状态码
(3)响应状态描述符
2.响应头
(1) key: value
空行
3.响应体 ===>>回传给客户端的响应数据
图示:
4.MIME类型
Multipurpose Internet Mail Extensions 多功能internet邮件扩充服务 格式:”大类型/小类型“,与某种文件名相对应
MIME常见格式:
三、Junit使用
步骤
1.定义测试类(被测类类名加Test)
2.定义测试方法 建议:
参数:空参 方法名:test被测方法名 返回值:void
3.给方法加@Test
4.导入junit依赖环境
使用实例:
//被测类
public class Methods {
public static int add(int a, int b){
return a + b;
}
public static int sub(int a, int b){
return Math.abs(a - b);
}
}
//Junit使用 Assert.assertEquals 使用“断言”测试结果
public class MethodsTest {
/**
* 初始化方法:
* 用于申请资源,所有测试方法执行之前都会执行该方法
*/
@Before
public void init(){
System.out.println("init ...");
}
/**
* 释放资源方法:
* 用于释放资源,所有测试方法执行之后都会执行该方法
*/
@After
public void close(){
System.out.println("close ...");
}
/**
* 测试
*/
@Test
public void testAdd(){
int result = Methods.add(1,3);
System.out.println("test");
Assert.assertEquals(4,result); //期望结果,运算结果
}
}