1.MVC:(Model-View-Controller)操作流程
显示层View:主要负责接收Servlet传递的内容,并调用JavaBean把内容显示给用户。
控制层Controller:负责所有的用户请求参数,判断请求参数是否合法,根据请求方式调用JavaBean进行处理,把结果返给显示层进行显示。
模型层Model:完成一个独立的业务操作组件。一般以JavaBean或者EJB(分布式组件技术)来定义的。
最关键的是RequestDispatcher接口:因为内容是通过该接口保存到JSP页面技能型显示的。
page、request、session、application
在MCV设计模式中,所有的属性传递以request方式(因为:保存范围越大占用的内存越多)进行传递,可以提升代码的操作性能。
简洁、清晰的JSP页面应包含的内容: 在JSP页面中唯一允许导入的包是java.util。
1.接收属性:接收来至Servlet传递过来的属性。
2.判断语句:判断传递到JSP中的属性是否存在。
3.输出语句:使用迭代输出或者JavaBean输出。
2.过滤器Filter
实现过滤器功能:实现javax.servlet.Filter接口
应用一:编码过滤
在每个JSP页面或者Servlet中,设置字符编码格式request.setCharacterEncoding("UTF-8");可使用Filter进行设置
import java.io.IOException;import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;public class EncodingFilter implements Filter {private String charSet;//字符编码 @Overridepublic void destroy() {System.out.println("过滤器已销毁...");}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,ServletException {// 执行过滤System.out.println("执行过滤之前:doFilter()");req.setCharacterEncoding(this.charSet); //统一设置编码 chain.doFilter(req, resp);//请求继续传递System.out.println("执行过滤之后:doFilter()");}/*** 在容器启动的时候自动加载,通过getInitParameter()获取配置的初始化参数,只初始化一次。*/@Overridepublic void init(FilterConfig config) throws ServletException {String initParam = config.getInitParameter("encoding");//获取初始化参数this.sharSet = initParam ;System.out.println("过滤器初始化,初始化参数是:" + initParam);} }
web.xml中的配置
<filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param>
</filter>
<filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/jsp/*</url-pattern>
</filter-mapping>
<url-pattern>:表示一个过滤器的过滤位置:/*表示对于根目录下的一切操作都进行过滤;若只过滤某一个或者某个目录,则必须明确写出对应的目录.
应用二:登录验证
import java.io.IOException;import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession;public class LoginFilter implements Filter {@Overridepublic void destroy() {}/*** session本身属于HTTP协议的范畴,doFilter()定义的是ServletRequest,* 要想获取session,必须进行向下转型:ServletRequest改成HttpServletRequest,才能使用getSession()获取session对象。*/@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,ServletException {HttpServletRequest hsp = (HttpServletRequest)req;//向下转型HttpSession ss = hsp.getSession();if(ss.getAttribute("userId") != null){ //判断用户是否登录 chain.doFilter(req, resp);}else{req.getRequestDispatcher("login.jsp").forward(req, resp); //跳转到登录页面 }}@Overridepublic void init(FilterConfig arg0) throws ServletException {} }
3.监听器Filter
应用1:对application的监听
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;//对上下文状态的监听public class ServletContextListenner implements ServletContextListener {@Overridepublic void contextDestroyed(ServletContextEvent event) {//上下文销毁触发System.out.println("容器销毁" + event.getServletContext().getContextPath());}@Overridepublic void contextInitialized(ServletContextEvent event) {//上下文初始化触发System.out.println("容器初始化"+ event.getServletContext().getContextPath());} }
web.xml配置
<listener><listener-class>com.mxzer.common.listener.ServletContextListenner</listener-class> </listener>
所有Servlet程序必须在web.xml进行配置,配饰顺序如下:
1.先配置过滤器:<filter>、<filter-mapping>
2.再配置监听器:<listener>
3.最后配置Servlet:<servlet> 、<servlet-mapping>
应用2:对Servlet上下文属性的监听,要实现ServletContextAttributeListener接口
应用3:对session的监听
3.1实现HttpSessionListener接口
session销毁的方式:
(1)调用HttpSession中的invalidate()方法
(2)在web.xml中配置session的超时时间
<!-- session 失效时间 单位30分钟 --><session-config><session-timeout>30</session-timeout></session-config>
3.2对session属性的监听,要实现HttpSessionAttributeListener接口,需要在web.xml配置
方式二:使用HttpSessionBindingListener接口
/** * 使用HttpSessionBindingListener * session属性监听:不需要在web.xml中配置 * */ public class ServletContextListenner implements HttpSessionBindingListener {private String loginName; //登录名public ServletContextListenner(String loginName) {this.loginName = loginName;}public String getLoginName() {return loginName;}public void setLoginName(String loginName) {this.loginName = loginName;}@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("在session中保存登录对象" + this.getLoginName()+"session ID:"+event.getSession().getId());}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println("在session中移除登录对象" + this.getLoginName()+"session ID:"+event.getSession().getId());}}
3.4对request监听
请求状态的监听:实现ServletRequestListenner接口
System.out.println("request请求初始化" +"http://"+ event.getServletRequest().getRomoteAddr());System.out.println("request请求初始化" +"http://"+ event.getServletContext().getContextPath());
属性的监听:实现ServletRequestAttributeListener
System.out.println(event.getNmae() + event.getValue());