笔记—JSP项目总结

137 阅读3分钟

用到的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:译为“过滤器”
用来拦截、过滤客户端的请求和服务器的响应

image.png

有注解、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先创建。最后销毁。

image.png

  • 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的创建时机

  • 负数
    1. 首次访问Servlet时,才创建Servlet
    2. 默认值是;-1
  • 非负数
    1. 项目部署到Web容器中就会创建Servlet
    2. 数值越小,越先创建
@WebServlet(value = "/contact/*",loadOnStartup = 3)

JSP的9大内置对象

image.png

使用这些内置对象必须导入依赖

<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域对象中获取数据

image.png

<%-- 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

客户端向服务器提交请求的方式:

  1. 在地址栏输入URL,敲回车
  2. 提交表单(form)
  3. window.localtion.href = URL (相当于第1种)

以上3种方式的特点: 1.都会修改浏览器的地址栏 2.都是同步请求 3.服务器返回的数据会直接覆盖之前的整个网页

同步请求:不能局部更新,只能更新整个页面 异步请求:可以局部更新

下面界面另一种请求方式,异步请求,AJAX

image.png

JS原生API JQuery

原生GET

image.png

原生POST

image.png

jQuery - ajax

image.png

image.png