servlet
- servlet接口及实现具体类
- 解决了浏览器请求java程序中.class接收响应问题
- 一旦有一个类可以接受浏览器请求,java对象就可以调用dao对象访问数据库
- 代替了serive使用网络套接字和外界进行数据通信。
servlet使用
- 操作步骤
- 搭建Web开发环境
- 创建动态Web工程
- 创建javax.servlet.Servlet接口的实现类:com.atguigu.servlet.MyFirstServlet
- 在service(ServletRequest, ServletResponse)方法中编写如下代码,输出响应信息:
- 在web.xml配置文件中注册MyFirstServlet
- 由服务器提供servlet的实现。
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
//1.编写输出语句,证明当前方法被调用
System.out.println("Servlet worked...");
//2.通过PrintWriter对象向浏览器端发送响应信息
PrintWriter writer = res.getWriter();
writer.write("Servlet response");
writer.close();
}
//xml配置如下:
<!-- 声明一个Servlet -->
<servlet>
<!-- 为Servlet指定一个名称,以便于引用 -->
<servlet-name>MyFirstServlet</servlet-name>
<!-- 注册Servlet实现类的全类名 -->
<servlet-class>com.atguigu.servlet.MyFirstServlet</servlet-class>
</servlet>
<!-- 建立一个从虚拟路径到Servlet之间的映射关系 -->
<servlet-mapping>
<!-- 引用Servlet名称 -->
<servlet-name>MyFirstServlet</servlet-name>
<!-- 映射到Servlet的虚拟路径:“/MyFirstServlet” -->
<url-pattern>/MyFirstServlet</url-pattern>
</servlet-mapping>
servlet访问机制
- 标签中设置java servlet的url地址,
- 并由标签中设置java servlet类的权限定名映射。
- 访问设置的目录即可和web页面一样访问,支持a标签等跳转。
servlet生命周期,从创建到销毁
- 构造器,浏览器请求访问本servlet时创建,首次访问执行
- init() 初始化参数,创建止之后初始化,首次访问执行
- service() 执行,接受请求,服务器提供参数列表,每次访问执行一次
- destroy() 销毁,关闭web容器(服务器tomcat)时销毁,因为服务器不确定是否还会再使用
servletConfig和ServletContext
- servletConfig
- 定义:servletConfig相当于servlet配置信息
- 作用:
- 获取当前Servlet名字:get…
- 获取当前servlet初始化参数:get…
- 获取SerletContext对象
- ServletContext
- 定义:相当于当前的web项目
- 作用:
- 当前web下的初始化参数
- 获取当前web的真实路径:上传下载
- 域对象
servlet类实际创建方式
- extends HttpServlet类
- extends GenericServlet类
- GenericServlet类实现了servlet类,把servletConfig提升成属性或内置对象,并部分对原始方法做实现
- HttpServlet类继承了GenericServlet类,把servletConfig实现并拆分成doget和dopost方法,实现了所有的方法但没处理所以方法大多为空,等待子类继承实现,一般重写的为doget和doset方法
- 新建的servlet类继承HttpServlet类只需重写doget和doset方法,即可把响应的操作注入servlet中,这种模式类似于thread类中重写run方法。
请求响应参数
- request
- 类型:HttpServletRequest requets
- 定义:相当于浏览器向服务器中发送的请求报文,客户端在第一次请求servlet时,创建,同时以参数的形式传递都get()和dopost().
- 作用
- 获取客户端的请求参数
- 获取当前项目的虚拟路径
- 转发…获取转发对象->转发
- 域对象
- 方法
- getParameter(String args);
- getContextPath();
- getRequestDispatcher(String url);
- response
- 类型:HttpServletResponse
- 定义:相当于服务器向浏览器发送的响应报文,客户端在第一次请求servlet时,创建,同时以参数的方式传递到doget()和dopost().
- 作用:
- 向客户端响应页面或文本
- 重定向
- 方法
- sendRedirect(String url);
转发重定向的区别
- 客户端路径
- 转发可以访问WEB-INF下的资源,重定向不能访问
- 转发是服务器发送的,只发送一次请求,重定向是浏览器发送的,发送两次
- 转发可以request域中的资源,重定向不能共享
路径问题
- 相对路径和绝对路径以及转发和重定向处理方式不同而导致的问题
- 相对路径
- 相对于当前路径下跳转访问文件/文件,可以直接访问同级目录,可以通过层级的方式访问同级目录下的子级目录,,或者…/方式访问父级目录,使用“/”分割目录名或文件名
- 绝对路径问题
- “/”开头代表着项目绝对路径
- 浏览器解析,基于服务器路径:localhost:8080;
- 服务器解析,基于当前项目路径:localhost:8080:name;
- 解析分类
- html页面中的路径由浏览器解析
- 重定向由浏览器解析
- 转发由服务器解析
- url-pattern标签由服务器解析
- 处理方式,全部项目使用绝对路径,只区分是由浏览器解析还是使用服务器解析
- base标签的href属性可以设置下面的标签的相对路径都基于href设置的路径
- 动态根路径:
<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/">
乱码问题
- 编码:将字符转成二进制过程
- 解码:将二进制转成字符的过程
- 乱码:编码和解码字符集不一致,出现乱码
- 浏览器->服务器:请求乱码
- 服务器->浏览器:响应乱码
- 默认情况
- 服务器默认编码解码方式一致:ISO-8859-1
- 浏览器编码默认为:
- 处理方式
- 请求乱码:
- post请求,request.setCharacterEncoding(String env)。
- get请求,
- 使用String构造器
- server.xml里面改变自字符集,设置端口的标签属性添加:URIEncodeing=“utf-8”
- 默认get请求,例如a, form
- 响应乱码
- //response.setCharacterEncodeing(“utf-8”)…验证不可行
- response.setContentType("text/html;charset=utf-8)…响应头添加解码方式
- response.setCharacterEncodeing(“GBK”)…验证通过