Servlet笔记
Servlet
1)、简介
Servlet是运行在服务器上的一段小java程序,通过http来接收和响应用户的请求。
Servlet是sun公司制定的一套规范。
所有Servlet的实现类都可以称为Servlet
2)、HelloWorld
1、创建Servlet的实现类
2、在service方法中写代码
3、web.xml里面配置servlet
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.sutdy.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
4、当用户访问:http://localhost:8080/项目名/LoginServlet
5、Servlet的生命周期
Servlet运行在Servlet容器里,Tomcat服务器,
服务器创建和销毁servlet对象,管理servlet
构造器;创建对象
init();初始化
service();处理请求
destory();销毁
第一次请求servlet的时候
构造器--》init()--》service()
以后请求
service();
销毁
web应用被卸载 destory()
private ServletConfig config;
init(ServletConfig config){
this.config = config;
};
3)、ServletConfig
代表:当前Servlet的配置信息 一个Servlet对应一个ServletConfig
获取:Servlet初始化时服务器将ServletConfig对象传入init方法。
功能:
1)、获取Servlet别名
config.getServletName()
2)、获取Servlet初始化参数
<servlet>
<servlet-name>ConfigServlet</servlet-name>
<servlet-class>com.atguigu.servlet.ConfigServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>leifengyang</param-value>
</init-param>
</servlet>
config.getInitParameter("name值");
3)、获取ServletContext对象
config.getServletContext();
4)、ServletContext
代表:Servlet上下文,也就是当前web应用,一个web应用对应一个ServletContext
获取:servletConfig.getServletContext();
功能:
1)、获取当前web项目的初始化参数
<context-param>
<param-name>user</param-name>
<param-value>root</param-value>
</context-param>
String user = context.getInitParameter("user");
2)、获取web项目在服务器上的路径,虚拟路径 /项目名 http://localhost:8080/项目名
String path = context.getContextPath();
3)、获取当前web项目下资源的真实路径 服务器上存储的实际路径(磁盘路径)
String realPath = context.getRealPath("资源在web项目下的虚拟路径");
4)、作为最大的域对象共享数据 ServletContext application
域对象可以用来在不同的web资源中共享数据
pageConext request session application
5)、HttpServlet--->eclipse自动创建
专门用来处理Http请求
doGet():处理get请求
doPost():处理post请求
doGet(){
doPost();
}
doPost(){
//写代码
}
用户发来一个请求--->servlet(service())--->GenericServlet(service())--->
HttpServlet(重写的service()-->service(判断请求类型))
--->doGet()
--->doPost();
6)、HttpServletRequest
代表:封装当次Http请求信息的对象
获取:服务器会自动传入
功能:
1)、获取请求参数
request.getParameter("username");//key-value
request.getParameterValues("aihao");//获取多选框之类的数据
2)、转发
request.getRequestDispatcher("success.html").forward(request,response);
3)、获取请求头信息
request.getHeader("请求头");
request.getHeaders("请求头");
4)、作为域对象共享数据
application request
5)、获取项目虚拟路径
String path= request.getContextPath();
7)、HttpServletResponse
代表:代表当次的响应对象
获取:服务器传参进入
功能:
1)、给页面输出内容
response.getWriter().write("HelloWorld");
2)、重定向
response.sendRedirect("重定向的位置");
8)、转发与重定向
他是在web应用中页面跳转的重要手段
转发 重定向
浏览器地址栏 不变 变
请求次数 1 2
使用方式 request response.sendRedirect();
.getRequestDispatcher()
.forward(request,response)
位置 服务器内部找资源并返回 浏览器端处理(重新访问)
WEB-INF(受保护) 可以 不可以
共享请求域数据 可以共享 不可以
目标资源 只能找当前项目里面 任意位置
9)、字符编码问题
乱码问题原因:字符集不统一
1、get请求提交中文(放在url里面)
原因:服务器获取解析url的时候不知道编码规则
修改服务器的配置文件:server.xml
8080 URIEncoding="utf-8"
2、post请求提交中文(放在请求体里)
原因:服务不知道怎么解析收到的文字
request.setCharacterEncoding("utf-8");
3、响应也乱码 response.getWriter.write("中文")
原因:浏览器不知道写出的这些数据的编码及内容类型
response.setContentType("text/html;charset=utf-8");
10)、工程路径问题
1)、url组成
http://localhost:8080/项目名/资源名
协议名://主机名:端口号/项目名/资源名
2)、路径问题
相对路径:不以/开始,相对于当前资源的路径
在转发情况下,相对路径可能不靠谱
绝对路径:以/开始,相对于根目录的路径
推荐使用绝对路径
1、页面上的路径: /代表得是服务器的根目录 http://localhost:8080
写绝对路径加上项目名
<a href=""></a> <img src=""> <form action=""> <script src=""> <link href="">...
2、服务器上的路径: /代表 当前项目 http://localhost:8080/项目名
<url-pattern>/login</url-pattern>
request.getRequestDispatcher("/login-success.html")
3、重定向的路径:他是浏览器解析 /代表得是服务器的根目录 http://localhost:8080
response.sendRedirect(reuqest.getContextPath+"/资源路径")
Servlet运行流程
HttpServlet原理图解:
虚拟路径与真实路径图解
转发和重定向图解