什么是Servlet
- Servlet(Server Applet)是Java Servlet 的简称,称为小服务程序或服务连接器,用Java编写的服务端程序,主要的功能在与交互式地浏览和修改数据,生成动态Web内容
- 一个普通的类继承HttpServlet的类就是一个Servlet
- 类中的 doGet() 以及 doPost() 分别用于处理网页的 get 和 pos t请求
在 web.xml 文件中可以为相应的 Servlet 配置对应的虚拟访问路径:
<web-app>
<!-- 给LoginServlet类配置一个对外访问的虚拟路径 -->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.java.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet<servlet-name>
<url-pattern>/LoginSerlvet<url-pattern>
</servlet-mapping>
<!-- 这个配置的作用是可以通过指定的 url 来访问对应的Servlet -->
</web-app>
除了使用在 web.xml 文件中添加标签的方式来进行访问路径的设置,还可以通过直接在Java代码上添加注解的方式,如下:
@WebServlet("/LifeServlet")
public class aServlet extends HttpServlet {...}
通常在更换了发布的机器的时候,可能路径就会改变,为了适应这样的情况,可以在jsp页面中动态的获取项目的基本路径情况,如下:
在jsp页面中添加如下代码,在需要用到路径的地方添加basePath即可
<%
String basePath = request.getScheme() + ":" + "//" + request.getServerName() + ":" + request.getServerPort() + request.getServletContext().getContextPath();
%>
<!-- 在需要使用路径的时候 -->
<form action="<%=basePath%>LoginServlet" method="post">...</form>
Servlet的生命周期 : 三个阶段
- 1、 初始化阶段调用init()方法 : 当Servlet第一次访问的时候会被调用
- 2、 响应客户请求阶段调用service()方法 : 每次请求的时候都会被调用
- 3、终止阶段调用destory()方法 : 当Servlet被销毁的时候调用(工程在tomcat中移除的时候)
jsp常用于动态的展示数据,而Servlet常用于处理逻辑的部分
请求与响应
- 浏览器对服务器的一次访问称为一次请求,请求用HttpServletRequest对象来表示
- 服务器给浏览器的一次反馈成文一次响应,响应用HttpServletResponse对象来表示
在浏览器提交了请求之后,可以通过以下方式来获取到请求中传向服务器的参数:(只要是表单提交的数据,在后台都是以str类型获取):
protected void doGet(HttpServletRequest request, HttpServletResponse response){
//获取表单提交过来的数据
String userName = request.getParameter("userName");
String password = request.getParameter("password");
}
ServletContext 与 ServletConfig
- Java是一门面向对象的语言,万事万物接对象。整个JavaWeb工程也可以用一个对象来表示,这个对象就是ServletContext
- 我们可以在web.xml文件中给摸一个Servlet配置一些配置信息,当服务器被其中的时候,这些配置信息就会被封装到某一个ServletConfig对象中去。因此,ServletConfig表示某一个Servlet对象的配置文件
在web项目中可以通过以下方式来获取到代表整个工程的ServletContext,因为获取到的对象是一个域对象,可以往其中添加内容,而且在同一个工程下的任意地方获取到的ServletContext是同一个(可能使用了单列模式)而且能够获取到在其他地方添加的内容:
//获取代表某一个JavaWeb工程的ServletContext对象
//并且往里面存放数据
ServletContext context = this.getServletContext();
context.setAttribute("username", "zhz");
//取出数据
Object result = context.getAttribute("username");
转发与重定向
- 相同点: 都是用于页面的转换
- 实现转发调用的是HttpServletRequest对象中的方法,实现重定向调用的是HttpServletResponse对象中的方法
- 转发是浏览器的url地址栏不会发生改变,重定向浏览器中的url地址会发生改变
- 转发时浏览器只请求一次服务器,重定向时浏览器请求两次服务器
- 转发的实现: request.getRequestDispatcher("/sucess.jsp").forward(request, response);
- 重定向的实现: response.sendRedirect("/imooc/fali.jsp");
如果在页面转换的时候需要携带数据到指定的页面,有如下处理方法:
转发时携带数据: 通过给request对象添加数据
request.setAttribute("username", " bob" );
request.getRequestDispatcher("/demo.jsp").forward(request, response);
重定向写带数据: 通过向代表web项目的ServletContext中写入数据,在jsp中使用application(也是代表项目的)获取到数据:
//在Servlet代码中添加数据:
//通过重定向携带数据
ServletContext sc = request.getServletContext();
sc.setAttribute("goods", "娃娃");
response.sendRedirect("/imooc/demo.jsp");
//在jsp中获取数据
<%
String goods = (String) application.getAttribute("goods");
out.print(goods);
%>