- MVC是一种设计模式
MVC是观察者模式(Observer), 策略模式(Strategy)和组合模式(Composite)三个设计模式的演变,MVC是模式的组合,是一种编程架构 - 其中M表示 model 模型, com.z.User 就是一个model ,模型专门用来传送数据。可以跨越多层。
- 其中V表示 view 视图, /WEB-INF/jsp/所有jsp页面,都是视图,视图有2个作用,1收集用户数据(form),2 显示数据。(table div)
- 其中C表示controller 控制器,com.xaeduask.web.servlet中的所有类,都是控制器,负责处理用户数据,并根据处理结构,跳转到不同的view(视图)
- el表达式
EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
2、[ ]与.运算符
EL 提供“.“和“[ ]“两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如 . 或 - 等并非字母或数字的符号,就一定要使用“[ ]“。例如:
u s e r . M y − N a m e 应 当 改 为 { user. My-Name}应当改为 user.My−Name应当改为{user[“My-Name”]}
如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:
${sessionScope.user[data]}中data 是一个变量
<%
Dog d1=new Dog("哈巴狗","黑色",19);
Dog d2=new Dog("拉布拉多","黄色",3);
Dog d3=new Dog("金毛","金色",6);
Dog d4=new Dog("藏獒","白色",8);
Map map=new HashMap();
map.put("a", d1);
map.put("b", d2);
map.put(2, d3);
map.put("1", d4);
pageContext.setAttribute("a",map);
%>
${1<2?'a':'b'}
Jsp三大利器:servlet 过滤器 监听器
- 过滤器
过滤器也是一个java类,只不过他实现了Filter接口。它在服务器开启的时候就开始执行,没访问一次调用一次,项目从服务器上卸载之后就执行关闭
- 过滤器配置
这里的*表示只要访问filter下的所有项目,都会执行过滤器,都会被过滤器拦截下来。
- chain.doFilter后面的代码,会在目标资源执行完毕之后才执行!
现在过滤器没有任何条件就放行了,可以访问到也面了。过滤器不拦截了。其实过滤器拦截下来之后先进行中文乱码处理,屏蔽敏感字,管理员与游客登录权限设置等操作之后再放行,这样才能发挥过滤器的作用。 - 解决中文乱码:
- 设置表单提交方式
- 我们可以学过滤器连,可以有多个过滤器拦截请求,按filter-mapping配置顺序来拦截!(顺序就是在配置文件中,谁的位置在前,哪个过滤器就先执行,这样可以让一个过滤器只执行一个拦截要求,多个过滤器搭配使用,实现程序运行。它可以在过滤器放行之前来处理请求信息,拦截部分请求,也可以在过滤器放行之后来处理服务器响应的数据,给客户端部分响应)
过滤器应用
1:可以在filter中根据条件决定是否放行(设置用户黑名单)
2:在目标资源执行之前对request,response做预处理,再放行!(解决中文乱码,替换敏感字符)
3:在目标资源执行之后,可以捕获目标资源的执行结果!(关闭数据库链接)
- 过滤器生命周期:
1.在服务器启动时,自动创建过滤器的对象,创建时,直接调用init方法。
2.每当过滤器拦截到请求,则自动调用doFilter方法!
3.在卸载web应用时,会自动销毁过滤器对象,在销毁时,自动调用destory方法。 - 在web.xml中配置全局属性和局部属性
设置的属性可以在过滤器中使用,在过滤器开启也就是服务器开启后,开始加载web.xml的属性值,然后当客户端访问服务器经过过滤器时,把参数传进去,然后让客户端带着参数去访问服务器。
1,设置属性:(这里解决中文乱码)
2,过滤器的操作
用户在配置filter时,可以使用< init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可以获得:
1,String getFilterName():得到filter的名称
2,String getInitParameter(String name):返回部署描述中指定名称的初始化参数的值。如果不存在返回null
3,Enumeration getInitParameterName(): 返回过滤器的所有初始化参数的名字的枚举集合
4,public ServletContext getServletContext():返回Servlet上下文对象的引用
案例:
package com.z.filter;
import java.io.IOException;
import java.util.Enumeration;
import javax.persistence.Enumerated;
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.HttpServletResponse;
public class MyFilter implements Filter{
private String defaultCharset;
private FilterConfig config;
@Override
public void destroy() {
System.out.println("关闭");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("执行");
//表单提交方式必须为pose
String charset=config.getInitParameter("charset");
System.out.println(charset);
String name=config.getFilterName();
System.out.println(name);
Enumeration e=config.getInitParameterNames();
while(e.hasMoreElements()){
Object obj=e.nextElement();
String value=config.getInitParameter(obj.toString());
System.out.println(obj+":"+value);
}
chain.doFilter(request, response);
System.out.println("执行结束");
}
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("启动");
this.config=config;
}
}
执行结果:
- 过滤器的权限控制
只要用户访问了admin中的任何资源,都会经过过滤器!
- 过滤器配置中的dispatcher元素的使用:
Dispatcher就是用于告诉过滤器,去拦截哪一种访问方式的!
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<%@ page errorpage=“error.jsp”%> 这种方式过滤器拦截不了,因为它已经把错误信息处理了,对于处理之后的不拦截,拦截没有处理的。