servlet相关
1. JSTL标签库
JSTL标签库:里面提供了大量的标签。如if标签、for标签等
目的是减少jsp中<%%>的出现
1.1 核心标签库
如何使用jstl标签
- 引入jstl标签库
- 在网页中引入标签库地址
<%--在网页中引入jstl标签的核心标签库的地址,prefix中的别名可以随意定义
引入核心标签库的地址 prefix:前缀 别名 uri:核心标签库的地址--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
- 使用相应的标签
可以结合EL表达式一起使用
if标签
<%
User user=new User(1,"hzsd","456");
request.setAttribute("user",user);
%>
<%--test:条件表达式 没有else--%>
<%--jstl标签库中的==和equals等价的--%>
<c:if test="${user.id==2}">
第一个用户
</c:if>
for标签
<%
List<User> list=new ArrayList<>();
list.add(new User(1,"张一","121"));
list.add(new User(2,"张二","122"));
list.add(new User(3,"张三","123"));
list.add(new User(4,"张四","124"));
request.setAttribute("list",list);
%>
<table width="600" border="1px" cellspacing="0" align="center">
<tr>
<th>编号</th>
<th>姓名</th>
<th>密码</th>
</tr>
<%--循环标签 items表示被循环的数组或集合 var:每次循环拿到的值赋值的变量 begin:从哪开始 end:到哪结束 step:步数--%>
<c:forEach items="${list}" var="s">
<tr>
<td>${s.id}</td>
<td>${s.name}</td>
<td>${s.password}</td>
</tr>
</c:forEach>
</table>
choose when other标签
java中switch语句
<c:choose>
<c:when test="${age>0 and age<10}">小学</c:when>
<c:when test="${age>=10 and age<18}">高中</c:when>
<c:when test="${age>=18 and age<25}">大学</c:when>
<c:otherwise>家里蹲</c:otherwise>
</c:choose>
redirect重定向标签
<c:redirect url="add.jsp"></c:redirect>
1.2 格式化标签库
网页中引入格式化标签
<%--引入核心标签库的地址 prefix:前缀 别名 uri:核心标签库的地址--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("birthday",new Date());
%>
<%--value:要格式的数据 pattern:格式化后的样式--%>
<f:formatDate value="${birthday}" pattern="yyyy年MM月dd日 HH:mm:ss"></f:formatDate>
<input type="text" value="<f:formatDate value='${birthday}' pattern='yyyy-MM-dd'/>"/>
</body>
</html>
2. servlet
2.1 what
本质就是java类,做到了承上启下的作用,可以接收请求的数据,也可以把数据相应给前端页面
等价于处理页面,目的是为了减少<%%>的出现
2.2 why
目的是减少jsp中<%%>的使用
如果没有servlet,需要为每一个前端类型提供一种处理功能,替代处理界面
2.3 how
创建一个类并继承HttpServlet
public class MyServlet extends HttpServlet {
//重写父类中的方法.接受参数以及业务处理
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("代码~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
}
在web.xml文件中注册该servlet,后续有简化方法,即在相应的类中添加注解
把servlet类的创建交于tomcat容器创建
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--注册servlet-->
<servlet>
<!--servlet的名称可以随便起-->
<servlet-name>myServlet</servlet-name>
<!--指定自定义的servlet路径-->
<servlet-class>com.ykq.servlet.MyServlet</servlet-class>
</servlet>
<!--请求路径映射到该servlet-->
<servlet-mapping>
<!--保证该名称必须和上面注册的名称一致-->
<servlet-name>myServlet</servlet-name>
<!--路径,可以随意定义,但必须加/-->
<url-pattern>/my</url-pattern>
</servlet-mapping>
</web-app>
2.4 servlet接收请求的参数值
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编码设置
req.setCharacterEncoding("utf-8");
//接受参数
String name = req.getParameter("name");
String age = req.getParameter("age");
System.out.println("name=========="+name+";age=========="+age);
//跳转
// resp.sendRedirect("aaa.html");
req.getRequestDispatcher("aaa.html").forward(req,resp);
}
2.5 完成登录
servlet中的代码
public class LoginServlet extends HttpServlet {
private UserDao userDao=new UserDao();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String password = request.getParameter("password");
User user = userDao.selectByNameAndPwd(name, password);
if(user!=null){
//获取session对象
HttpSession session = request.getSession();
//保存数据到session
session.setAttribute("user",user);
//跳转成功页面
response.sendRedirect("success.jsp");
}else{
response.sendRedirect("login.jsp");
}
}
}
2.6 使用注解简化web.xml注册的代码
web版本为3.0以后
2.7 快速建立servlet【没有不用】
2.8 一个servlet实现多个请求
正常情况下一个表的操作都放在一个servlet中。处理多个请求
处理方法:发送请求时传递一个标志参数
@WebServlet(name = "StudentServlet",urlPatterns = "/StudentServlet")
public class StudentServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接受操作的标志
String method = req.getParameter("method");
if("add".equals(method)){
add(req,resp);
}else if("delete".equals(method)){
delete(req,resp);
}else if("update".equals(method)){
update(req,resp);
}else{
list(req,resp);
}
}
private void list(HttpServletRequest req, HttpServletResponse resp) {
}
private void update(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("~~~~~~~~~~~~~~~~~~~修改学生update~~~~~~~~~~~~~");
}
//删除学生的操作
private void delete(HttpServletRequest req, HttpServletResponse resp) {
//接受删除学生的id
//调用dao完成删除功能
//跳转
System.out.println("~~~~~~~~~~~~~~delete删除学生~~~~~~~~~~~~~~~");
}
//添加学生
private void add(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("~~~~~~~~~~~~~~add添加学生~~~~~~~~~~~~~~~~~~~~");
}
}
2.9 servlet的生命周期
servlet对象从创建到销毁经历哪些阶段。每个阶段执行相应的方法
- 创建new[只会执行一次]
- 初始化阶段[只会执行一次]
- 服务阶段[每次请求都会执行]
- 销毁阶段[服务器关闭时]
public class MyServlet extends HttpServlet {
//只执行一次。----单例模式[节省内存]
public MyServlet(){
//创建servlet经历的方法
System.out.println("构造servlet方法");
}
//初始化方法只执行一次
@Override
public void init(ServletConfig config) throws ServletException {
//本servlet局部参数
String name = config.getInitParameter("name");
String age = config.getInitParameter("age");
//获取web全局参数
String address = config.getServletContext().getInitParameter("address");
System.out.println("初始化阶段"+name+";"+age+";"+address);
}
//每次请求都会经过service服务阶段
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("服务阶段---");
}
@Override
public void destroy() {
System.out.println("销毁阶段");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--全局参数-->
<context-param>
<param-name>address</param-name>
<param-value>bj</param-value>
</context-param>
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.ykq.servlet.MyServlet</servlet-class>
<!--初始化的参数-->
<init-param>
<param-name>name</param-name>
<param-value>ldh</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>18</param-value>
</init-param>
<!--服务器启动时加载该servlet: 优点:客户访问速度快。 缺点:服务器启动慢了-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/My</url-pattern>
</servlet-mapping>
</web-app>
3. 注意点
- 退出登录:因为是保存到session会话中的信息,是在Servlet Java代码中实现退出登录,又因为Java中没有session对象,必须先通过req.getSession()方法获取,才能调用session的removeAttribute方法移除session会话中的信息
所有,实现步骤:
private void loginOut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//获取会话对象
HttpSession session = req.getSession();
session.removeAttribute("user");
resp.sendRedirect("login.jsp");
}
- 过滤器也可以通过添加注解实现注册该过滤器