一、JavaBean和ORM
1.JavaBean
JavaBean本质就是一个Java类为了规范开发,JavaBean具有如下规范:
(1)提供一个公共的无参的构造器
(2)属性私有化,并提供公共的setter/getter方法
2.ORM(Object Relational Mapping,对象关系映射)
(1)数据库的一张表对应一个JavaBean
(2)数据库的一个字段对应JavaBean的一个属性
(3)数据库的一条记录对应JavaBean的一个对象
二、MVC架构
【Spring】JavaBean、MVC软件设计模式与Java中Dao、Service、Controll三层体系
1.Model(模型)
业务处理:业务逻辑(Service层)
数据持久层:CRUD(Dao层)
2.View(视图)
展示数据,提供链接发起Servlet请求(a,form,img…)
3.Controller(控制器)
接收用户的请求:(req:请求参数、Session信息…),交给业务层处理对应的代码,控制视图的跳转
例如登录功能的实现:
登录—>接收用户的登录请求—>处理用户的请求(获取用户登录的参数,username,password)—>交给业务层处理登录业务(判断用户名密码是否正确:事务)—>Dao层查询用户名和密码是否正确–>数据库
三、Filter过滤器
1.Filter过滤器:基本功能就是对Servlet容器调用Servlet的过程进行操作,从而在Servlet进行响应处理前后实现的一些特殊功能。如:请求和响应编码、权限检查、输出通用信息等。
Filter过滤器就是一个实现了javax.servlet.Filter接口的的类。
2.Filter链
3.实现过滤器的步骤
(1)编写java类实现Filter接口,重写接口中的方法
(2)在web.xml中配置Filter
4.演示将Servlet中的设置编码格式放在Filter中
Servlet
public class ShowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.setCharacterEncoding("utf-8");
// req.setCharacterEncoding("utf-8");
// resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("你好,我是JavaWeb程序");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
过滤器
public class FilterServlet implements Filter {
//tomcat启动就会初始化,随时准备过滤请求
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("FilterServlet初始化中...");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");//设置Servlet中的request编码格式
servletResponse.setCharacterEncoding("utf-8");//设置Servlet中的response编码格式
servletResponse.setContentType("text/html;charset=utf-8");//设置Servlet中的响应的web页面的编码格式
System.out.println("FilterServlet执行前...");
filterChain.doFilter(servletRequest,servletResponse);//让过滤器一直进行下去,否则就会执行一次后终止
System.out.println("FilterServlet执行后...");
}
@Override
public void destroy() {
System.out.println("FilterServlet销毁...");
}
}
web.xml
<!--配置servlet-->
<servlet>
<servlet-name>ShowServlet</servlet-name>
<servlet-class>com.jd.filter.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/show/servlet</url-pattern>
</servlet-mapping>
<!--过滤器-->
<filter>
<filter-name>FilterServlet</filter-name>
<filter-class>com.jd.filter.FilterServlet</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterServlet</filter-name>
<!--过滤器只能过滤特定的请求,此处只能过滤/show/开头的请求-->
<url-pattern>/show/*</url-pattern>
</filter-mapping>
将项目部署到tomcat中,启动服务,访问浏览器,可以看到尽管注释了Servlet中设置的编码,但是FIlter中的编码生效,web页面并没有出现乱码。
查看idea的控制台可以看到,在tomcat启动结束后就完成了,每次的请求都会交给过滤器处理
关闭tomcat服务,Filter也被销毁。
四、Listener监听器
作用:监听某个事件的发生,状态的改变。如:鼠标点击、按下键盘等
内部机制:接口回调
Servlet共有8种事件监听器
类型 | 描述 |
---|---|
ServletContextListener | 监听ServletContext对象的创建和销毁过程 |
HttpServletListener | 监听HttpSession对象的创建和销毁过程 |
ServletRequestlistener | 监听ServletRequest对象的创建和销毁过程 |
ServletContextAttributeListener | 监听SerlvetContext对象中的属性变更 |
HttpSesionAttributeListener | 监听HttpSession对象中的属性变更 |
ServletRequestAttributeListener | j监听ServletRequest对象中的属性变更 |
HttpSessionBindLIstener | 监听JavaBean对象绑定到HttpSession对象和从HttppSession对象解绑的事件 |
HttpSessionActivationListener | 监听HttpSession中对象活化和钝化的过程 |
活化:HttpSession对象从持久化的状态变为运行状态的过程称为活化。
钝化:HttpSession对象从内存中转移至硬盘的过程称为钝化。
示例:监听当前在线的人数
OnlineCount.java
public class OnlineCount implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {//当服务器会话创建时的方法
HttpSession session = httpSessionEvent.getSession();
ServletContext ctx = session.getServletContext();//通过httpSessionEvent来获取servletContext对象
Integer onlineCount = (Integer) ctx.getAttribute("onlineCount");//获取servletContext中的onlineCount的值,首先是不存在的
if (onlineCount == null) {
onlineCount = new Integer(1);//当不存在时,往onlineCount里面存值1
} else {
int count = onlineCount.intValue();
onlineCount = new Integer(count + 1);//否则当存在时,onlineCount的值就+1
}
ctx.setAttribute("onlineCount", onlineCount);//将改变的onlineCount值存入session中
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {//当服务器会话关闭时的方法
HttpSession session = httpSessionEvent.getSession();
ServletContext ctx = session.getServletContext();
Integer onlineCount = (Integer) ctx.getAttribute("onlineCount");
if (onlineCount == null) {
onlineCount = new Integer(0);
} else {
int count = onlineCount.intValue();
onlineCount = new Integer(count - 1);//当会话关闭时,onlineCount的值就-1
}
ctx.setAttribute("onlineCount", onlineCount);
}
}
web.xml中配置监听器
<!--配置监听器-->
<listener>
<listener-class>com.jd.filter.OnlineCount</listener-class>
</listener>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<h1>当前人数:<%=application.getAttribute("onlineCount")%></h1>
<%=this.getServletConfig().getServletContext().getAttribute("onlineCount")%>
</body>
</html>