用到的jar包
数据库连接池
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
操作java bean map转bean、克隆bean等
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
User user = new User();
BeanUtils.populate(user, request.getParameterMap());
序列化和反序列化
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
@JsonIgnore
public String getJson () throws Exception{
ObjectMapper mapper = new ObjectMapper();
// 设置时间格式 也可以在属性getter方法注解@JsonFormat(pattern = "yyyy-MM-dd")
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
String json = mapper.writeValueAsString(this).replace(""", "'");
return json;
}
文件上传
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
图片验证码
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
Filter
Filter:译为“过滤器”
用来拦截、过滤客户端的请求和服务器的响应
有注解、XML两种使用方式
注解的方式
:
@WebFilter("/*")
public class LoginFilter implements Filter {}
@WebFilter("/*")
public class CharsetFilter implements Filter {}
XML的方式
: web.xml配置
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.scc.xr.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>com.scc.xr.filter.CharsetFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
执行顺序
request那条线,
xml方式按照从上到下顺序执行。上面例子CharsetFilter先执行;
注解按照ASCII码大小,小的先执行(com.scc.xr.filter.CharsetFilter 比 com.scc.xr.filter.LoginFilter 小)
Filter生命周期方法
-
init 1.将Filter添加到Web容器中时调用 2.一般用来加载资源
-
destroy 1.将Filter从Web容器中移除时调用 2.一般用来销毁资源
dispatcherTypes属性
dispatcherTypes属性的常用值
- REQUEST: 默认值,只拦截客户端直接发送的请求
- FORWARD: 只拦截转发的请求
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
@WebFilter(value = "/*", dispatcherTypes = DispatcherType.FORWARD) //只拦截转发请求
@WebFilter(value = "/*", dispatcherTypes = {DispatcherType.FORWARD, DispatcherType.REQUEST}) //传个数组,客户端请求和转发都拦截
ServletContext
ServletContext全局只有一个,当web程序部署到服务器容器(Tomcat)时,创建ServletContext,当web程序取消部署时,ServletContext销毁
一个ServletContext对象就代表一个Web应用,可以用来与Web容器(Tomcat)通信
获取ServletContext
- request.getServletContext()
- servlet.getServletContext()
常用方法
- getMIMEType
getServletContext().getMimeType("xx.png");
tomcat/conf/web.xml
中有各种MiMEType
- setAttribute\getAttribute\removeAttribute
共享范围整个web应用。共享范围:request->session->servletContext
- getRealPath
文件上传的时候用到,获取项目部署的路径。
servlet.getServletContext()
getServletContext();
request.getServletContext();
都可以获取到,而且全局只有一个。
Listener
Listener:译为“监听器” 比较常用的是ServletContextListenser,用来监听ServletContext的创建和销毁。 所以监听Web程序部署和取消部署,可以用Listener 和 Filter.一般用Listener.而且ServletContext比Filter先创建。最后销毁。
- contextInitialized: ServletContext创建的时候调用
- contextDestroyed: ServletContext销毁的时候调用
项目中BaseServlet里的部分代码,放进contextInitialized更合理。
public void contextInitialized(ServletContextEvent sce) {
/* This method is called when the servlet context is initialized(when the Web application is deployed). */
DateConverter dateConverter = new DateConverter(null);
dateConverter.setPatterns(new String[]{"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss"});
ConvertUtils.register(dateConverter, Date.class);
}
有注解、XML两种使用方式
@WebListener
public class ContextListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {}
web.xml配置
<!-- 配置listener-->
<listener>
<listener-class>com.scc.xr.listener.ContextListener</listener-class>
</listener>
Servlet补充
有init、destroy生命周期方法。 init:Servlet创建的时候调用,默认第一次发请求的时候创建; destroy: servlet被销毁的时候调用
可以通过注解、XML方式使用
web.xml配置
<servlet>
<servlet-name>ContactServlet</servlet-name>
<servlet-class>com.scc.xr.servlet.ContactServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContactServlet</servlet-name>
<url-pattern>/contact/*</url-pattern>
</servlet-mapping>
@WebServlet(value = "/contact/*")
public class ContactServlet extends BaseServlet<Contact> {}
可以使用loadOnStartup属性设置Servlet的创建时机
- 负数
- 首次访问Servlet时,才创建Servlet
- 默认值是;-1
- 非负数
- 项目部署到Web容器中就会创建Servlet
- 数值越小,越先创建
@WebServlet(value = "/contact/*",loadOnStartup = 3)
JSP的9大内置对象
使用这些内置对象必须导入依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
pageContext当前页面共享数据
request 同一个请求共享数据
session 多个请求共享数据
application 同一个应用
利用EL表达式从JSP域对象中获取数据
<%-- isErrorPage="true" 才会有exception--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
System.out.println(request);
System.out.println(response);
System.out.println(session);
System.out.println(application); // servletContext
System.out.println(page); // 当前jsp,jsp本质是servlet,所以page就是代表当前的servlet
System.out.println(pageContext);//jsp比servlet多出的。用来当前页面共享数据。
// pageContext.setAttribute(),pageContext.getAttribute(),pageContext.removeAttribute();
System.out.println(out);//用来输出内容 out.writer()
System.out.println(config); // ServletConfig,servlet的一些配置
System.out.println(exception);//异常信息 Throwable.需要加上 isErrorPage="true"
%>
<! --
EL表达式中
pageScope --> pageContext
requestScope --> request
sessionScope --> session
applicationScope --> application
-->
<%--相当于<% pageContext.getAttribute("name")%>--%>
<input type="text" value="${pageScope.name}">
<input type="text" value="${user.name}"> //会首先去pageContext里找,然后request .... 从小到大寻找user
<input type="text" value="${param.name}"> // http://localhost:8080/ccr/admin.jsp?name=123. 获取请求参数name
</body>
</html>
AJAX
客户端向服务器提交请求的方式:
- 在地址栏输入URL,敲回车
- 提交表单(form)
- window.localtion.href = URL (相当于第1种)
以上3种方式的特点: 1.都会修改浏览器的地址栏 2.都是同步请求 3.服务器返回的数据会直接覆盖之前的整个网页
同步请求:不能局部更新,只能更新整个页面 异步请求:可以局部更新
下面界面另一种请求方式,异步请求,AJAX