javaweb
servlet技术
Servlet的作用
- 处理表单提交
- 用户认证
- 会话管理
- 请求转发和重定向
- 生成动态Web内容
- 扩展基于HTTP协议的Web服务器
servlet如何与客户端通信
客户端发送请求,服务器接收请求,Servlet容器根据请求的地址以及Servlet之间的映射,调用相应的Servlet,Servlet处理完数据后将结果转交给Servlet容器,并通过Http服务器将响应结果传输给客户端。
基本使用方法
//定义servlet名字和请求的地址
@WebServlet(name="servlet",urlPatterns="/servlet")
public MyServlet extends HttpServlet{
// 接收get请求时执行
public doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
//TODO
}
// 接收post请求时执行
public doPoset(HttpServletRequest request,HttpServletResponse response) throws SerlvetException,IOException{
//TODO
}
}
生命周期
- 初始化阶段,当有请求时,Servlet容器会创建Servlet的实例,并调用init()方法进行初始化。
- 运行阶段,创建的Servlet对象会调用service()方法处理请求。
- 销毁阶段,当服务器关闭或web应用被移除容器时,Servlet会调用destory()方式进行销毁。
常用方法
设置中文
java//设置HttpServletResponse使用utf-8编码 response.setCharacterEncoding("utf-8"); //通知浏览器使用utf-8解码 response.setHeader("Content-Ytpe","text/html;charset=utf-8");
java//包含第一种的两种功能 response.setContentType("text/html;charset=utf-8");
java//request只能设置setCharacterEncoding属性 request.setCharacterEncoding("utf-8");
输出信息
javaPrintWriter print = response.getWriter(); print.writer("信息")
重定向
javaresponse.seedRedirect("/login.html")
请求转发
java//获得RequestDispatcher对象 RequestDispatcher dispatcher = request.getRequestDispatcher("/login"); //转发 dispatcher.forward(request,response)
获得请求参数
获取用户提交的表单内容
java//获取指定参数 String value = request.getParameter("user"); //获取多个同名参数 String[] values = request.getParameterValue("user");
通过Requset传递参数
java//存放数据,属性名和属性值 requst.setAttribute("user","lisi"); //读取数据 String name = request.getAttribute("user"); //移除属性 request.removeAttribute("user");
getParameter()和getAttribute()的区别
getParameter()读取的是从客户端发送请求中的参数,代表的http请求,返回类型只有string
getAttribute()读取的是从其他页面转发来的请求的数据,需要与setAttribute()配合使用,返回类型可以是String或者是对象。
Filter
filter用于拦截并修改request和reponse对象
Filter的常见作用
能够对请求和响应进行检查和修改,通常将请求拦截后进行一些通用的操作,例如: 过滤敏感词、统一字符编码、权限控制,还可以提取公共代码提高程序性能。
基本使用方法
//定义过滤器的名字和拦截servlet地址
@WebFilter(filterName="filter",urlPatterns="/servlet") implements FIlter{
//初始化时执行
public void init(FilterConfig fc){
}
//运行时执行
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws ServletException,IOException{
//调用FilterChain.doFilter(request,response)方法继续执行servlet。
chain.doFilter(request,response)
}
//销毁时执行
public void destory(){
}
}
生命周期
- 创建阶段:当启动服务器时,会调用init()方法进行初始化。
- 运行阶段:当有请求时,服务器会筛选出符合条件的过滤器,执行其doFilter()方法.
- 销毁阶段:当服务器关闭时,服务器会调用destroy()方法进行销毁。
注解
- @WebServlet
- @WebFilter
- @webListener:修饰Listener类,部署Listener类
- @WebInitParam:为@WebServlet、@WebFilter注解配置参数
- @MultipartConfig:
- @ServletSecurity
会话技术
会话是指客户端和服务器之间连续发生的一系列请求和响应过程,服务器跟踪用户信息的技术称为会话技术,在servlet中提供两个用于保存会话数据的对象,分别是cookie和session
COOKIE
保存在浏览器本地中,可以长期保存,存储的内容较少
基本使用
//判断是否有cookie
Cookie[] cookies = request.getCookie();
for(Cookie cookie : cookies){
if("cookieName".equals(cookies.getName())){
//读取值
System.out.println(cookie.getValue());
}
}
// 不是第一次可以设置cookie
Cookie cookie = new Cookie("cookieName","cookieValue");
//设置有效时间一分钟,负数代码退出浏览器立马销毁
cookie.setmaxAge(60);
//添加cookie
response.addCookie(cookie);
SESSION
保存在服务器中,生命周期比cookie短,存储的内容较多。超时是指在指定时间内没有任何请求,tomcat默认超时时间为30分钟。
基本使用
//获取或创建Session,getSession(false)表示不存在时返回null,其他情况会自动创建
HttpSession session = request.getSession();
//设置属性
request.getSession().setAttribute("SessionName","sessionValue");
//读取属性值
String value = request.getSession().getAttribute("SessionName");
//使用cookie保存
Cookie cookie = new Cookiew("JSESSIONID",session.getId());
设置超时时间
立刻注销该reques的session
javaHttpSession session = request.getSession(); session.invalidate()
在web.xml设置失效时间,默认单位为分钟
xml<session-config> <session-timeout>30</session-timeout> </session-config>
在servlet中设置失效时间,默认单位为秒,-1则是从不超时
javasession.setMaxInactiveInterval(60*60);
JSP
jsp运行时jsp容器会把jsp文件转换为servlet
语法
定义
<%!...%>
执行
<%...%>
输出
<%=...%>
指令
<%@...%>
指令
page
<%@ page 属性名1=属性值1...%>
include
<%@ include file="被包含的文件地址"%
>taglib
<%@ taglib prefix="指定标签的前缀" uri="标签地址"%>
标签统一地址:
http://java/sun/com/jsp/jstl/具体标签库名
具体标签库有五个
- 核心标签库(core)
- 格式标签库(fmt)
- SQL标签库(sql)
- XML标签库(xml)
- 函数标签库(functions)
组合结果:
<%@ taglib prefix="c" uri="http://java/sun/com/jsp/jstl/core"%>
动作元素
包含文件元素
<jsp:include page="URL" flush="true|false />"
请求转发元素
<jsp:forward page="URL />"
<jsp:useBean>
、<jps:setProperty>
创建bean的实例和为实例赋值
jsp<jsp:useBean id="JavaBean实例名" class="bean所在的包名"> <jsp:setProperty name = "JavaBean实例名" property = "JavaBean属性名" value = "BeanValue"/> </jsp:useBean>
隐式对象
名称 | 描述 |
---|---|
application | 所有用户共享的信息 |
session | 用于保存用户的信息 |
request | 得到用户请求信息 |
response | 服务器向客户端回应的信息 |
page | 指当前页面转换为servlet后的实例 |
config | 服务器配置,可以取得初始化参数 |
excption | 表示jsp页面发生的异常,只有在错误页面才有用 |
out | 用于页面输出 |
pageContext | jsp的页面容器,可以获得其他八个隐式对象。 |
EL&JSTL
EL
el可以在jsp中读取数据、执行运算、调用java方法和获取web开发常用对象。
语法
基本形式
${表达式}
运算符和其他编程语言类似
获取数据
获取变量的属性
点运算符(
.
)${lisi.age}
中括号运算符(
[]
)主要用来访问属性名有特殊符号的变量
${lisi.["My-age"}
判断是否为空
${empty lisi.age}
为空则返回true,否则返回false
隐式对象
隐式对象名称 | 描述 |
---|---|
pageContext | 对应jsp页面的pageContext,可以通过它获取jsp隐式对象 |
applicationScope | application域中的map对象 |
sessionScope | session域中的map对象 |
requestScope | request域中的map对象 |
pageScope | page域中的map对象 |
param | 所有请求参数的map对象 |
paramValue | 所有请求参数的map对象,返回String类型数组 |
header | 所有http请求头的map对象 |
headerValue | 所有http请求头的map对象,返回String类型数组 |
cookie | 使用者的cookie值,map类型 |
initParam | 保存了所有web应用初始化参数的map对象 |
JSTL
Core标签库
表达式标签
<c:out>
:用来向页面输出信息<c:out value="vlaue" default="defaultValue">
default属性用来指定value变量为null的情况下输出内容
<c:remove>
:用来移除指定的jsp范围内的变量<c:remove var="name" scope="范围">
流程控制标签库
<c:if>
语法
<c:if test="布尔表达式" var="表达式名">
var可省略
示例
jsp<c:if test="${user.name=="admit"}"> ${user.name} is admit </c:if>
<c:choose>
、<c:when>
、<c:ontherwish>
jsp<c:choose> <c:when test="${empty param.name}"> unKnown user </c:when> <c:when test="${param.user=='admit'}"> ${param.user} is admit </c:when> <c:ontherwish> ${param.user} is employee </c:ontherwish> </c:choose>
相当于if-else语法,当都不满足时执行
<c:ontherwish>
代码块
循环标签
<c:forEach>
语法
jsp<c:forEach var="变量名" items="集合变量名" begin="起始索引" end="结束索引" step="步长"> TODO </c:forEach>
begin、end、step可省略。起始索引从0开始。
示例
jsp<c:forEach var="user" items="${userList}"> user.name </c:forEach>
数据库
JDBC
JDBC编程的6个开发步骤
加载并注册数据库驱动
Class.forName("com.mysql.jdbc.driver");
使用DriverManager获取connection对象
Connection connection = DriverManager.getConnection(url,user,password);
使用Connection获取Statement对象
Statement statement = connection.createStatement();
使用Statement执行sql命令
execute(String sql)
:可以执行任何命令executeQuery(String sql)
:执行查询命令executeUpdate(String sql)
:执行更新命令处理ResultSet结果集
ResultSet rs = statement.executeQuery(sql);
释放数据库连接
使用预编译执行sql命令
java// 定义sql语句 String sql = "select * from user where name=? and password=?"; // 预编译sql PrepareStatement ps = connection.prepareStatement(sql); // 给占位符?设置参数,从1开始 ps.setString(1,"zhangsan"); ps.setString(2,"zhang12345"); // 执行sql命令 ResultSet rs = ps.executeQuery();
数据库连接池
数据库连接池负责分配、管理和释放数据库连接,它运行应用程序重复使用现有的数据库连接,而不是重新创建;当其他应用程序需要连接数据库时,向数据库连接池发出申请,当使用完毕后,数据库连接池将回收connection以供其他线程使用,从而减少创建和断开数据库连接的次数,提高数据库的访问效率。