web
Servlet
- 例子
创建一个servlet
类让其继承Servlet
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("构造器");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println(" service helloServlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
编写配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--servlet标签给tomcat配置servlet程序-->
<servlet>
<!--给servlet程序起一个别名 一般是类名-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet程序的全类名-->
<servlet-class>com.hyq.servert.HelloServlet</servlet-class>
</servlet>
<!--给servlet程序配置访问路径-->
<servlet-mapping>
<!--告诉服务器,当前配置的地址给那个servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--访问地址-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
浏览器输入地址:http://localhost:8080/java_02_web_Web/hello
控制台打印的是servlet
类中service
方法中的结果:helloServlet
servlet
声明周期,执行顺序:构造器-->init()-->service()--->destroy()
仍然用上面的servlet
类,访问http://localhost:8080/java_02_web_Web/hello
时
浏览器打印了如下结果:
构造器
init
service helloServlet
服务未关闭情况下,再次访问http://localhost:8080/java_02_web_Web/hello
时,只会执行service
的方法。在关闭服务时,执行destroy()
方法
servletContext
的作用
① 获取web.xml
中配置的上下文参数context-param
② 获取当前的工程路径,格式:/工程路径
③ 获取工程部署后在服务器硬盘上的绝对路径
④ 像Map一样存储数据
⑤ SerletContext
是一个接口,它表示Serlet
上下文对象
⑥ 一个web
工程,只有一个SerletContext
对象实例。
⑦ ServletContext
是在web
工程部署启动的时候创建。在web
工程停止的时候销毁。
例子:
编写一个servlet
类,继承HttpServlet
public class ServletContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
javax.servlet.ServletContext context = getServletContext();
//获取web.xml中配置的上下文参数 context-param
String url = context.getInitParameter("url");
System.out.println(url); // www.baidu.com
// 企图获取 init-param 参数值;getInitParameter()方法只能获取 context-param 里面的值
System.out.println(context.getInitParameter("name")); //null
//获取当前工程路径 格式:/工程名称
System.out.println(context.getContextPath()); // 【/java_02_web_Web】
//获取工程部署后 在服务器硬盘上的绝对路径
//【E:\CodeMgr\ideacode\javastudy\out\artifacts\java_02_web_Web_exploded\】
System.out.println(context.getRealPath("/"));
}
}
配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>ServletContext</servlet-name>
<servlet-class>com.hyq.servert.ServletContext</servlet-class>
<!--初始化参数-->
<init-param>
<param-name>namespace</param-name>
<param-value>hyq</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletContext</servlet-name>
<url-pattern>/ServletContext</url-pattern>
</servlet-mapping>
<!--上下文参数-->
<context-param>
<param-name>url</param-name>
<param-value>www.baidu.com</param-value>
</context-param>
</web-app>
例子
- 编写
web.xml
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>ServletContext</servlet-name>
<servlet-class>com.hyq.servert.ServletContext</servlet-class>
</servlet>
<servlet>
<servlet-name>ServletContext2</servlet-name>
<servlet-class>com.hyq.servert.ServletContext2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletContext</servlet-name>
<url-pattern>/ServletContext</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletContext2</servlet-name>
<url-pattern>/ServletContext2</url-pattern>
</servlet-mapping>
</web-app>
- 编写
servlet
类继承httpServlet
类
public class ServletContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
javax.servlet.ServletContext context = getServletContext();
Object name = context.getAttribute("name");
System.out.println("name="+name);
context.setAttribute("name","hyq");
System.out.println("name="+context.getAttribute("name"));
}
}
- 编写
servlet2
类继承httpServlet
类
public class ServletContext2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
System.out.println("name="+context.getAttribute("name"));
}
}
在地址栏输入地址:http://localhost:8080/java_02_web_Web/ServletContext
访问结果:
name=null
name=hyq
服务没有停止时,在地址栏输入地址:http://localhost:8080/java_02_web_Web/ServletContext2
访问结果:
name=hyq
再此在地址栏输入地址:http://localhost:8080/java_02_web_Web/ServletContext
访问结果:
name=hyq
name=hyq
结论:ServletContext
启动后,工程中只存在一个
Get/Post请求
响应的Http协议格式
1、响应行
(1)响应的协议和版本号
(2)响应状态码
(3)响应状态描述符
2、响应头
key:value
不同的响应头,有其不同合义
空行
3、响应体: 就是回传给客户端的数据
Servlet
的请求转发和重定向
编写Servlet1
和Servlet2
类
//Servlet1
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取参数值
String name = req.getParameter("name");
//把参数存入request中
req.setAttribute("myName",name);
//请求转发到服务器2
// 请求转发必须以【/】打头./在服务器转发时代表的地址是 http://ip:port/工程名
RequestDispatcher dispatcher = req.getRequestDispatcher("/servlet2");
dispatcher.forward(req,resp); //转发
}
}
//Servlet2
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
System.out.println("myName=="+name);
}
}
编写web.xml
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>Servlet1</servlet-name>
<servlet-class>com.hyq.servert.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet1</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Servlet2</servlet-name>
<servlet-class>com.hyq.servert.Servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet2</servlet-name>
<url-pattern>/servlet2</url-pattern>
</servlet-mapping>
</web-app>
测试:在地址栏输入地址:http://localhost:8080/java_02_web/servlet1?name=hyq
结果是:myName==hyq
请求转发的结论:
① 地址栏没有发生变化
② 从A转发到B 共享Request的数据,且是一次请求
③ 可以转发到WEB-INF目录下,正常访问,不允许访问WEB-INF目录下的文件
④ 不允许访问 站外资源,如www.baidu.com 。
重定向
web 中 / 的作用
① / 如果被浏览器解析,得到的地址是 http://ip:port/;即当前站点
如:
<!-- 此时若点击斜杠会跳转到 http://localhost:8080/ -->
<a href='/'>斜杠</a>
<!-- 此时若点击跳转会跳转到 http://localhost:8080/a.html -->
<a href='/a.html'>跳转</a>
② / 如果被服务器解析,得到的地址是 http://ip:port/工程名称
如:
1. <url-pattern>/ServletContext2</url-pattern>
2. ServletContext.getRealPath("/")
3. req.getRequestDispatcher("/");
特殊情况:response.sendRediect("/")
; 把斜杠发送给浏览器解析,得到的地址是:http://ip:port/
Servlet
解决中文乱码
//设置服务器编码
response.setCharacterEncoding("utf-8");
//告诉浏览器 使用什么编码
response.setHeader("Content-Type","text/html;charset=UTF-8");