JavaWeb
大家五一几天假期呢,昨天晚上写完今天打算发给大家,看到了活动,这里也简短的向大家表示辛苦,特别是当你五一看到我这篇文章时,你可能还处于工作学习状态respects,那也需要抽出时间放松一下,休息一下!
前情回顾:
【JavaWeb】-Tomcat、Eclipse使用项目搭建(一)
【JavaWeb】-mysql、jdbc、dbcp使用(二),看完你还不会吗
都非常的简单,如果小伙伴跟上来了,那我们继续往下学习吧,虽然这些都是讲解,最后可能还是会出一个综合例子,然后可能会更好,看到这里了就点个赞吧!
文章目录
MVC
介绍
mvc同样也是一种概念,来自百度百科:
其实就是下面的逻辑图
在编码上我们将自己的代码也做成了这层;
Servlet
介绍,来自百度百科:
服务器程序,servlet只是一直接口,凡是继承了这个接口的都是servlet,但是我们一般只使用httpServlet进行http请求,所以现在一般说的servlet指的是继承了httpServlet的类,我们可以写程序通过servlet映射出去可以访问;
下面我们来了解下servlet;
生命周期
首先就是servlet生命周期:
三个生命周期,init()、service()、destroy();
init() 方法
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。
service() 方法
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
destroy() 方法
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。destroy 方法定义如下所示:
public void destroy() {
// 终止化代码...
}
那这里我们主要使用service(),但是我们不去实现这个方法,而是通过service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
我们主要实现doGet和doPos方法体,接收用户请求;
快速上手
我们来快速新建一个servlet来看看,右键新建servlet:
那一个servlet我们就创建好了,这是代码自己生成的,我们来看下他给我们创建的都是什么代码以及怎么使用:
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloServlet
* 这里的注解,就是我们的请求路径
*/
@WebServlet("/HelloServlet")
//继承HttpServlet ,而HttpServlet实现了servlet接口
public class HelloServlet extends HttpServlet {
//序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloServlet() {
//构造方法
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
* doGet方法体
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//默认给请求的响应,这里我们注释了,写我们自己的响应
//response.getWriter().append("Served at: ").append(request.getContextPath());
response.getWriter().print("hello World");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
* doPost方法体
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//调用了doGet方法,这里我们可以这么使用,这样我们都使用doPost
doGet(request, response);
}
}
我们运行项目并访问HelloServlet请求,ok测试成功:
这是注解的方式配置请求路径,我们可以通过web.xml配置请求路径:
我们新建项目时的web.xml
打开,我们可以通过xml配置请求路径:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>xuexiriji</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置一个servlet --> <!-- servlet的配置 -->
<servlet> <!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>HelloServlet</servlet-name> <!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet> <!-- servlet的映射配置 -->
<servlet-mapping> <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>HelloServlet</servlet-name> <!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
我们把WebServlet注解注释掉,再次运行,访问配置的hello路径,访问成功:
四大作用域
优先级从小到大
- PageContext : 页面作用域范围有效,jsp页面内置对象
- Requset : 一次请求作用域范围有效
- Session :一次会话作用域范围有效
- ServletContext :一次服务作用域,web应用加载起来,就一直在,管理多个servlet
下面总结使用方法:
其实四大作用域不管哪个对象最常用的,90%都是这三个getAttribute()、setAttribute()、removeAttribute()
PageContext
pageContext对象是javax.servlet.jsp.PageContext类的实例对象,用来代表整个JSP页面。它代表页面上下文,该对象主要用于访问 JSP 之间的共享数据,使用pageContext可以访问page、request、session、application范围的变量。
方 法 | 说 明 |
---|---|
forward(java.lang.String.relativeUtlpath) | 把页面转发到另一个页面 |
getAttribute(String name) | 获取参数值 |
getAttributeNames(int scope) | 获取某范围的参数名称的集合,返回值为java.util.Enumeration对象 |
getException() | 返回exception对象 |
getRequest() | 返回request对象 |
getResponse() | 返回response对象 |
getSession() | 返回session对象 |
getOut() | 返回out对象 |
getApplication() | 返回application对象 |
setAttribute() | 为指定范围内的属性设置属性值 |
removeAttribute() | 删除指定范围内的指定属性 |
在页面使用中我们很少使用,在jsp中我们再使用几次;
HttpRequest
//设置请求编码格式
requset.setCharaterEncoding("utf-8");
//获取请求参数
requset.getParameter();
//获取属性
request.getAttribute();
//设置属性
request.setAttribute();
//请求转发
request.getRequestDispatcher("/login.jsp").forward(request, response);
HttpRespones
//设置响应编码
response.setContentType( "text/ html; charset=utf-8");
//设置响应状态重定向,一般不这么用
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
//我们通常使用这个进行重定向
response.sendRedirect()
// 设置刷新自动加载的事件间隔为 5 秒
response.setIntHeader("Refresh", 5);
//获得网页写对象
PrintWriter out = response.getWriter();
out.print() //像屏幕输出数据,一般不这么用,我们后面直接用jsp
这里需要注意:
一般情况下的页面跳转就用sendRedirect , 用的不是同个request对象,而另一个则是
request.getRequestDispatcher()是请求转发,前后页面共享一个request ;
response.sendRedirect()是重新定向,前后页面不是一个request。
request.getRequestDispather();返回的是一个RequestDispatcher对象。
RequestDispatcher.forward()是在服务器端运行;
HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成.
所以RequestDispatcher.forward()对于浏览器来说是“透明的”;
而HttpServletResponse.sendRedirect()则不是。
ServletContext
servletContext,是Servlet中最大的一个接口,呈现了web应用的Servlet视图。
ServletContext实例是通过 getServletContext()方法获得的,由于HttpServlet继承GenericServlet的关系,GenericServlet类和HttpServlet类同时具有该方法。
没有太多东西,主要是还是这三个:getAttribute()、setAttribute()、removeAttribute()
小结
其实就是那么几个常用方法而已,这次博主没有给大家例子,大家可以自己去尝试做一下,自己动手就都是自己的,希望这篇文章对你有帮助,都看到这里了还确定不关注下吗
下期预告:Cookie、Session;