Servlet初识
a.servlet是JavaEE规范之一,规范就是接口
b.servlet是JavaWEB三大组件之一
-servlet
-filter 过滤器
-listener 监听器
手动实现Servlet程序
a.实现接口
public class MyServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
b.配置
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.controller.servlet.MyServlet</servlet-class>
</servlet>
<!--配置servlet访问地址-->
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<!--工程路径下,Servlet访问地址-->
<url-pattern>/</url-pattern>
</servlet-mapping>
Servlet访问流程
a.浏览器发送请求
b.tomcat监听端口
c.访问对应工程路径
d.检查web.xml配置,找到对应的类
e.执行service代码
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
}
Servlet生命周期
1.执行构造方法
2.执行init函数
3.执行Service
4.停止服务执行销毁释放资源
public class MyServlet implements Servlet {
public MyServlet() {
System.out.println("执行构造函数!");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("执行初始化!");
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("执行Service方法!");
}
public String getServletInfo() {
return null;
}
public void destroy() {
System.out.println("执行销毁方法");
}
}
Servlet请求分发
1.继承Servlet接口
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//类型转换
HttpServletRequest httpServletRequest = (HttpServletRequest)req;
if (httpServletRequest.getMethod().equals( "GET")) {
System.out.println("GET!");
doGEt();
} else {
System.out.println("POST!");
doPost();
}
}
public void doGEt() {};
public void doPost() {};
2.实现HttpServlet
public class MyHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// get逻辑
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// post逻辑
}
}
3.使用IDEA快速创建
1.右键包名
Servlet类体系
a.Servlet 定义访问规范
b.GenericServlet 做了一些空实现
c.HttpServlet 请求分发处理,并抛出异常源码如下
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
} else {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_post_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
} else {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
}
ServletConfig类
作用:
-获取Servlet程序的别名,servlet-name的值。
-获取初始化参数init-param
-获取servletContext对象
注:获取web.xml的配置
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-serverlet.xml</param-value>
</init-param>
注:servlet和servletConfig都是由tomcat创建,servlet在第一次使用时创建,Config在Servlet创建时就创建对用的config。
ServletContext
表示servlet上下文,一个模块只有一个servlet对象实例,servletContext是一个域对象。
域对象,可以像map一样存取数据的对象叫域对象。
作用:
-获取web.xml中配置的上下文参数
-获取当前的工作路径
-获取工程部署后在服务器硬盘上的绝对路径
-像map一样存取数据
获取参数
// get逻辑
ServletContext servletContext = getServletContext();
// 参数
servletContext.getInitParameter();
// 获取项目路径
servletContext.getContextPath();
// 工程部署目录
servletContext.getRealPath();
存储数据
servletContext.setAttribute();
注:在一个web工程中只有一个对象,web停止对象销毁,启动时创建。
Servlet请求
get:
Accept:客户端能接收的数据类型
Accept–language:可以接受的语言类型
user-agent:浏览器信息
Accept-encoding:客户端可以接受的编码格式或压缩格式
Connection:keep-alvie 响应完毕保持一小会儿连接
closed:关闭释放资源
post:
referer:表示请求发起是浏览器地址栏中的地址
Content-type:表示发送数据的类型
GET请求:
1.form method等于get
2.a标签
3.link引入样式资源
4.script引入js文件
5.image引入图片
6.浏览器中直接输入地址回车
常见响应码
200:成功
302:请求重定向
404:请求收到数据不存在
500:表示服务器已经收到请求但是服务内部错误
HttpServlet常用方法
getRequestURL:获取请求资源定位符
getRequestURI:获取请求资源路径
getRemoteHost:获取用户IP
getRemotePort:获取端口
getHeader:获取请求头
getParameter:获取请求参数
getParamterValues:获取请求参数
getMiethod:获取请求方式
setAttribute:设置数据
getAttribute:获取域数据
getRequestDispatcher:获取请求转发对象
// 获取参数之前提交,解决乱码
req.setCharacterEncoding(“UTF-8”);
req.getParameter("username");
// 多个值
req.getParameterValues();
请求转发
服务器跳转到另外一个资源
// /表示地址为http://ip:port/工程名/,映射到IDEA web目录
RequestDispatcher requestDispatcher =req.getRequestDispatcher("/Serverlet2");
// 请求转发
requestDispatcher.forward(req,resp);
注请求转转发的特点:
-浏览器地址没有变化
-是一次请求
-共享request的数据
-可以 转发值web-info目录下
-不可以访问外部资源
// 可以访问
RequestDispatcher requestDispatcher =req.getRequestDispatcher("/WEB-INFO/jsp/index.jsp");
// 外部资源不可以访问
RequestDispatcher requestDispatcher =req.getRequestDispatcher("www.baidu.com");
ServletBase作用
Servlet转发后由于地址没有变化,因此跳转不回去
Base标签设置工作时参考的相对路径
<html>
<head>
<title>Title</title>
// 设置相对路径,参照地址
<base href="xxx">
</head>
<body>
<p>李勇加油,不负韶华</p>
</body>
</html>
/地址
-浏览器解析:http://ip:port/
-服务器解析:http://ip:port/工程路径
-特殊情况respond.sendRediect("/"); //把/发送到浏览器解析,得到http://ip:port/
HttpservletResponse
请求进来时Tomacat创建
-字节流:getOutputStream()
-字符流 : getWriter();
两个只能使用其中一个,否则会报错
往客户端传递数据
PrintWriter writer = resp.getWriter();
writer.write("");
Servlet响应乱码问题
解决方案1:
resp.setCharacterEncoding("UTF-8");
resp.setHeader("Content-Type","text/html;charset=utf-8");
解决方案2:
// 同时设置服务器和客户端都使用UTF-8
// 此方法一定要在流获取之前才有效
resp.setContentType("text/html;charset=utf-8");
请求重定向
客户端发送请求至服务端,服务器给客户端一个新的地址访问,客户访问新地址,然后返回数据。
第一种方法:
resp.setStatus(302);
resp.setHeader("Location","http://localhost:8080/web");
第二种方法推荐使用:
resp.sendRedirect("http://localhost:8080/web");
请求重定向的特点:
-地址栏会发生变化
-请求两次
-不共享Request
-不能访问WEB-INFO下的资源
-可以访问外部资源