Servlet
Servlet的继承层次很多,但是web开发常用的也就是 javax.servlet.http.HttpServlet这个类,常用的两个请求方法是doGet(),doPost(),还有从父类继承过来 的方法init()初始化,destroy()Servlet销毁时会被调用,getServletConfig()获得ServletConfig对 象,getServletInfo()返回有关Servlet的信息,包括作者、Servlet版本等。Servlet的访问必须在web.xml里面进行配置。
常用方法:
1、 request.setCharacterEncoding("utf-8");//设置用post传递给服务器的参数编码方式
2、 response.setContentType("text/html;charset=utf-8");//设置发送给浏览器的内容编码
3、 HttpSession session = request.getSession();//获得session会话
session.setAttribute("a","b");//给session作用域中存值
可以这样取值:session.getAttribute("a");
4、 ServletContext context = this.getServletContext();整个web应用对象,或者用ServletConfig对 象.getServletContext()获得
String str = context.getInitParameter("encoding");//获得全局参数
5、 ServletConfig config = this.getServletConfig("p1");//获得某个Servlet专用的配置对象
String str =config.getInitParameter("p2");//获得某个Servlet的专有配置参数
6、 String str = request.getParameter("s");//获得页面传过来的参数
7、 String[] sa = request.getParameterValues("sa");//获得字符串数组
8、 request.setAttribute("r","XX");//往request作用域中存值。在页面可以${r}这样取出XX。
9、 PrintWriter out = response.getWriter();//获得标准输出流,此流内部做了处理直接会输出给浏览器。
10、request.getRequestDispatcher("/index.jsp").forward(request,response);//转发
response.sendRedirect("index.jsp");跳转
JSP
1、 常用指令:<%@ page language="java" import="java.util.*" contentType="text/html;charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ include file="/index2.jsp"%>
2、 常用动作:
<jsp:forward page="/index1.jsp">
<jsp:param name="username" value="BAOBAO"/>
</jsp:forward>
上面的forward相当于Servlet中的Request.getRequestDispatcher("/index1.jsp").forward(request,response);
<jsp:include page="/index.jsp">
<jsp:param name="username" value="XX"/>
</jsp:include>
<%@ include %>指令和<jsp:include>动作的区别,最主要一点就是include指令在jsp转换成Servlet前已经把 file设置的Jsp页面融入进当前jsp了,也就是说不论你用include指令包含了多少个Jsp,最后只会生成一个servlet文件,所以 include指令也不会传递参数。
3、 九大内置对象:
out、request、response、session、 application(ServletContext)、page(相当于Servlet中的this,代表当前页面即当前Servlet)、 pageContext(这个就是给当前jsp页面放置了一个变量 pageContext.setAttribute("CONTEXT_ROOT",request.getContextPath());)、 exception、config(ServletConfig)
4、 关于页面跳转陷阱:jsp中的绝对路径(/index.jsp)和servlet不同,它的根是指服务器即:http://localhost:8088/这是jsp的根,而Servlet的根指的是你的项目。
5、 接参
在 Jsp页面<%=request.getParameter("username")%>就等于${param.username},一般页 面给页面传的参数或者url中的参数在jsp中都可以用${param.name}去获取。${username}这样直接获取的是已经放在那4大作用域 里面的值。
6、 jsp EL4大内置对象:pageScope,requestScope,sessionScope,applicationScope,比如:${requestScope.username},如果不加这些内置对象则按照从小到的作用域范围去查找。
常用EL表达式和JSTL标签
${}取值、empty空、!非、?:三目运算符、==和!=
<c:if test=""></c:if>、<c:forEach items="${list}" var="user" varStatus="i">${i.index+1}</c:forEach>、
<c:choose>
<c:when test="${currentPageNumber eq pageNumber}">
<font color="red">${pageNumber}</font>
</c:when>
<c:otherwise>
<a href="${pageUrl}">${pageNumber}</a>
</c:otherwise>
</c:choose>
监听器
HttpSession有4个监听借口,ServletContext有2个监听借口,HttpServletRequest有两个监听借口。
监听器的作用就是当用户做出某些响应后则实现了对应监听器接口的类的某些方法会自动执行
web.xml中的配置:
<listener>
<listener-class>
com.mwt.Listener.CountListener
</listener-class>
</listener>
过滤器
过滤器要实现Filter接口,它的作用就是特定的访问要进过过滤器的某些方法过滤后在去执行所请求的类。
如:过滤所有请求的编码
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.mwt.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
关于编码
1、 <%@ page language="java" contentType="text/html;charset=utf-8"%>
<!-- 这个charset虽然是服务器返回给浏览器的编码,但它可能也改变浏览器本身的编码,即通知浏览器采用什么编码去显示内容。 -->
2、 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%// pageEncoding是JSP本身的编码,即它被转换成.java时所采用的编码,如果不设置默认为iso8859-1,这个和下面charset一般只设置一个,两个会同步。%>
<!-- 当.java文件在编译器编译成.class的时候都会采用utf-8去编译成二进制的字节码文件-->
<%//@ page language="java" contentType="text/html;charset=utf-8" 默认是iso8859-1 contentType里面的charset是指服务器吐出的内容的编码,也就是发送给客户浏览器时的编码 %>
3、 request.setCharacterEncoding("utf-8");//设置用post传递给服务器的参数编码方式(默认iso8859-1)。
如果是get方式传递参数则可以在tomcat里的配置文件中改编码即:
<Connector port="8088" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
如果还是解决不了乱码则可以从新组装字符串
如:byt[] b = str.getBytes("iso8859-1");
String newStr = new String("b","utf-8");
4、 response.setContentType("text/html;charset=utf-8");//设置发送给浏览器的内容编码,告诉浏览器使用哪种编码方式去打开页面。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 此xml用的是.xsd即schema约束,所以下面的servlet或者监听器等等顺序都是可以互换的 -->
<!-- 设置一个全局的参数,每个Servlet或jsp都能访问到 -->
<context-param>
<description>描述信息 </description>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</context-param>
<!-- Servlet配置项 -->
<servlet>
<description>描述信息</description>
<servlet-name>XmlServlet</servlet-name>
<servlet-class>com.mwt.Servlet.XmlServlet</servlet-class>
<!-- 专门给指定的Servlet添加参数,别的Servlet无法访问。 -->
<init-param>
<param-name>username</param-name>
<param-value>宝宝</param-value>
</init-param>
<!-- 设置Servlet加载时间,整数或者0指启动服务时就实例化Servlet对象,负数或没设置则请求时才创建对象 -->
<load-on-startup>8</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XmlServlet</servlet-name>
<url-pattern>/XmlServlet</url-pattern>
</servlet-mapping>
<!-- 第一个被加载:监听器配置项 -->
<listener>
<listener-class>com.mwt.listener.ServletContext_Listener</listener-class>
</listener>
<!-- 过滤器设置(仅次于监听器加载) -->
<filter>
<filter-name>FilterTest</filter-name>
<filter-class>com.mwt.filter.FilterTest</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterTest</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- HttpSession会话的有效时间设置(单位分钟,不能是小数)这里设置的时间意思是一分钟不访问此session后就过期,如果一直在用就不会过期。 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
<!-- 配置404(没有访问的页面时) -->
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<!-- 配置访问该web应用时的欢迎页面(找到index1就不会再找其他排在它后面的页面即index2) -->
<welcome-file-list>
<welcome-file>index1.jsp</welcome-file>
<welcome-file>index2.jsp</welcome-file>
</welcome-file-list>
</web-app>
补充:
response.setContentType("text/html;charset=UTF-8");//默认响应输出编码:iiso8859-1,所以转下码。
response.getWriter().print("<script language='javascript'>alert('账号或密码不正确!');location.href='login.jsp';</script>");
response.getWriter().close();//这句话鸡巴真重要,害的我半天不执行脚本!
切记:以后用完流后最好把它关了。