一:servlet3.0实现代码优化(优化配置文件)
使用注解@WebServlet(urlPatters="/请求地址")代替xml文件
原代码
<?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">
<display-name>Archetype Created Web Application</display-name>
<!--1.登录-->
<servlet>
<servlet-name>loginuser</servlet-name>
<servlet-class>
web.LoginServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginuser</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!--2.退出-->
<servlet>
<servlet-name>loginout</servlet-name>
<servlet-class>
web.LoginOutServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginout</servlet-name>
<url-pattern>/loginout</url-pattern>
</servlet-mapping>
<!--3.查询全部-->
<servlet>
<servlet-name>selectall</servlet-name>
<servlet-class>
web.SelectUsersServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>selectall</servlet-name>
<url-pattern>/selectusers</url-pattern>
</servlet-mapping>
<!--4.真删除-->
<servlet>
<servlet-name>deletebyid</servlet-name>
<servlet-class>
web.DeleteUsersServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>deletebyid</servlet-name>
<url-pattern>/deleteuser</url-pattern>
</servlet-mapping>
<!--5.假删除-->
<servlet>
<servlet-name>delete</servlet-name>
<servlet-class>
web.DeleteByIdServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>delete</servlet-name>
<url-pattern>/deletebyid</url-pattern>
</servlet-mapping>
<!--6.主键查询-->
<servlet>
<servlet-name>selectbyid</servlet-name>
<servlet-class>
web.SelectByIdServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>selectbyid</servlet-name>
<url-pattern>/selectbyid</url-pattern>
</servlet-mapping>
<!--7.更新操作-->
<servlet>
<servlet-name>update</servlet-name>
<servlet-class>
web.UpdateUserServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>update</servlet-name>
<url-pattern>/updateuser</url-pattern>
</servlet-mapping>
<!--8.新增操作-->
<servlet>
<servlet-name>add</servlet-name>
<servlet-class>
web.AddUserServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>add</servlet-name>
<url-pattern>/adduser</url-pattern>
</servlet-mapping>
</web-app>
这些代码将被删除,在每个servlet处理类中加入注解,替代他们
@WebServlet(urlPatterns = "/usersServlet")
name属性:
设置servlet的对象名
initParams属性:
设置初始化参数,在init()中获取数据的
这个属性是替代了web.xml文件中的标签
<servlet>
<servlet-name>aa</servlet-name>
<servlet-class>
com.yhp.web.LoginServlet
</servlet-class>
<init-param>
<param-name>a1</param-name>
<param-value>张三的初始化参数</param-value>
</init-param>
</servlet>
初始化参数案例
package com.yhp.web;
import com.yhp.bean.Users;
import com.yhp.service.UsersService;
import com.yhp.service.impl.UsersServiceImpl;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/login",name = "loginservlet",initParams = {
@WebInitParam(name = "a1",value = "张三的初始化参数"),
@WebInitParam(name="a2",value = "abcd") //初始化参数是在servlet的init方法中获取
},loadOnStartup = 2)
public class LoginServlet extends HttpServlet {
public LoginServlet() {
System.out.println("loginservlet---2");
}
// 重写方法时,二选一,1.重写service() 2.重写doGet()和doPost()
@Override
public void init(ServletConfig config) throws ServletException {
//获得初始化参数
String a1_value = config.getInitParameter("a1");
String a2_value = config.getInitParameter("a2");
System.out.println(a1_value+","+a2_value+"--->init()");
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
//1.接参数(记得处理编码方式)
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");//要和表单中的name值相同
String userpass = request.getParameter("userpass");
//2.写逻辑(面向接口编程)
UsersService usersService=new UsersServiceImpl();
Users u = usersService.login(username, userpass);
//3.返结果
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
if(u==null){
//登录失败(在后端返回给前端一个js弹窗)-如果使用js,则不要再使用重定向或转发的形式跳页面
//location.href 属于重定向跳转页面
writer.print("<script type='text/javascript'>alert('用户名或密码不正确');location.href='index.jsp'</script>");
}else{
//登录成功
HttpSession session = request.getSession();
session.setAttribute("u1",u);
writer.print("<script type='text/javascript'>alert('登录成功');location.href='success.jsp'</script>");
}
}
}
loadOnStartup属性:
设置启动的优先级
@WebServlet(urlPatterns = "/loginout",loadOnStartup = 1)
默认属性的值是-1,用户指定时,给正整数,且正整数越小,优先级越高
加完这个属性后,当前类的对象就会在服务器启动时,创建对象
设置优先级案例
package com.yhp.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(urlPatterns = "/loginout",loadOnStartup = 1)
public class LoginOutServelet extends HttpServlet {
public LoginOutServelet() {
System.out.println("loginout---1");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//清除session,跳转页面
HttpSession session = req.getSession();
session.invalidate();
//跳转index.jsp页面
resp.sendRedirect("index.jsp");
}
}
使用上面的注解,可以简化web.xml的内容,但是也不要删除web.xml
二:合并servlet(后端部位为主)
合并代码
统一请求名为/usersServlet
修改所有请求格式:/usersServlet?key=请求名
package com.yhp.web;
import com.yhp.bean.Users;
import com.yhp.service.UsersService;
import com.yhp.service.impl.UsersServiceImpl;
import com.yhp.util.PageUtil;
import com.yhp.util.myPageUtilsPlus;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
//所以操作users表的请求都走这个处理类
@WebServlet(urlPatterns = "/usersServlet")
public class UsersServlet extends HttpServlet {
//定义处理请求的新增方法
protected void adduser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接参数
//req.setCharacterEncoding("utf-8");
String uname = req.getParameter("uname");
String usex = req.getParameter("usex");
String uage = req.getParameter("uage");
String upass = req.getParameter("upass");
//2.调逻辑
UsersService usersService=new UsersServiceImpl();
Users users = new Users();
users.setUsername(uname);
users.setSex(usex);
users.setAge(Integer.parseInt(uage));
users.setPassword(upass);
int i = usersService.insert(users);
//3.返结果
resp.setContentType("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
if (i>0) {
writer.println("<script type='text/javascript'>alert('用户添加成功');location.href='/usersServlet?key=selectusers&pageIndex=1'</script>");
}else {
writer.println("<script type='text/javascript'>alert('用户添加失败');location.href='/add.jsp'</script>");
}
}
//定义处理请求的假删除方法
protected void deletebyid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接参数
String userid = (String) req.getParameter("userid");
int uid = Integer.parseInt(userid);
//2.写逻辑
UsersService usersService=new UsersServiceImpl();
int i = usersService.deleteByid(uid);
//3.返结果
resp.setContentType("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
if (i>0){
//删除成功 注意,不可以用重定向list.jsp
//deleteservlet->location.href->selectusersservlet->list.jsp
writer.println("<script type='text/javascript'>alert('用户删除成功');location.href='usersServlet?key=selectusers&pageIndex=1'</script>");
}else {
//删除失败
writer.println("<script type='text/javascript'>alert('用户删除失败');location.href='usersServlet?key=selectusers&pageIndex=1'</script>");
}
}
//定义处理请求的真删除方法
protected void deleteuser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接参数
String userid = req.getParameter("userid");
//2.调逻辑
UsersService usersService = new UsersServiceImpl();
int i = usersService.deleteUser(Integer.parseInt(userid));
//3.返结果
resp.setContentType("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
if (i>0){
//删除成功 注意,不可以用重定向list.jsp
//deleteservlet->location.href->selectusersservlet->list.jsp
writer.println("<script type='text/javascript'>alert('用户删除成功');location.href='/usersServlet?key=selectusers&?pageIndex=1'</script>");
}else {
//删除失败
writer.println("<script type='text/javascript'>alert('用户删除失败');location.href='/usersServlet?key=selectusers&pageIndex=1'</script>");
}
}
//定义处理请求的退出方法
protected void loginout(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//清除session,跳转页面
HttpSession session = req.getSession();
session.invalidate();
//跳转目标页面
resp.sendRedirect("index.jsp");
}
//定义处理请求的登录方法
protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接参数
//req.setCharacterEncoding("utf-8");
String username = req.getParameter("username");//要和表单的name值相同
String userpass =req.getParameter("userpass");
//2.写逻辑(面向接口编程)
UsersService usersService =new UsersServiceImpl();
Users u = usersService.login(username, userpass);
//3.返结果
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
if (u==null){
//登录失败(在后端给前端返回一个弹窗-若用js,就不要再用重定向或转发跳页面了否则405错误)
//location.href是属于重定向跳转页面
writer.print("<script type='text/javascript'>alert('用户名或密码不正确');location.href='index.jsp'</script>");
}else {
//登录成功
HttpSession session = req.getSession();
session.setAttribute("u1",u);
writer.print("<script type='text/javascript'>alert('登录成功');location.href='success.jsp'</script>");
}
}
//定义处理请求的id查询方法
protected void selectbyid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接参数
String userid = req.getParameter("userid");
//2.调方法
UsersService service =new UsersServiceImpl();
Users users =service.selectbyid(Integer.parseInt(userid));
//3.返结果
req.setAttribute("user",users);
req.getRequestDispatcher("update.jsp").forward(req,resp);
}
//定义处理请求的全查方法
protected void selectusers(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接参数
//req.setCharacterEncoding("utf-8");
String pageIndex = req.getParameter("pageIndex");
//如果没有接收到pageindex,默认查询第一页
int index = pageIndex==null?1:Integer.parseInt(pageIndex);//页码值
//接收模糊查询条件
String uname = req.getParameter("uname");
String usex = req.getParameter("usex");
//2.写逻辑
UsersService usersService =new UsersServiceImpl();
List<Users> users = usersService.selectALL(index, PageUtil.PAGESIZE,uname,usex);
//每页展示数据时,不够一页,也会独占一页位置
//10/5=2页,11/5=2...1 /3页。
//总页数=总条数%每页显示条数>0?总条数/每页显示条数+1:总条数/每页显示条数
int total = usersService.totalCount(uname,usex);//总条数
//int totalPages=total%PageUtil.PAGESIZE>0?total/PageUtil.PAGESIZE+1:total/PageUtil.PAGESIZE;//总页数
//3.返结果(后端给前端传数据,必然涉及存值问题,4个作用域选择request)
myPageUtilsPlus<Users> usersmyPageUtilsPlus = new myPageUtilsPlus<>();
usersmyPageUtilsPlus.setPageIndex(index);
usersmyPageUtilsPlus.setTotalCount(total);
//usersmyPageUtilsPlus.setTotalPages(totalPages);
usersmyPageUtilsPlus.setDataList(users);
//存储分页的条件
req.setAttribute("pu",usersmyPageUtilsPlus);
//存储模糊查询条件
req.setAttribute("username",uname);
req.setAttribute("usersex",usex);
req.getRequestDispatcher("/list.jsp").forward(req,resp);
}
//定义处理请求的更新方法
protected void updateuser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接参数+处理post请求的乱码
//req.setCharacterEncoding("utf-8");
String uid = req.getParameter("uid");
String uname = req.getParameter("uname");
String usex = req.getParameter("usex");
String uage = req.getParameter("uage");
String upass = req.getParameter("upass");
//2.写逻辑
UsersService usersService=new UsersServiceImpl();
Users users = new Users();
users.setUserid(Integer.parseInt(uid));
users.setUsername(uname);
users.setSex(usex);
users.setAge(Integer.parseInt(uage));
users.setPassword(upass);
int i = usersService.UpdateUser(users);
//3.返结果
resp.setContentType("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
if (i>0) {
//更新成功 回到展示用户列表的页面(不能直接跳回到list.jsp,而是需要重新发送新的请求,间接走到list.jsp)
writer.println("<script type='text/javascript'>alert('用户更新成功');location.href='/usersServlet?key=selectusers&pageIndex=1'</script>");
}else {
//更新失败 回到更新页面update.jsp(不能直接跳回到update.jsp,而是需要重新发送新的请求,间接走到update.jsp)
writer.println("<script type='text/javascript'>alert('用户更新失败');location.href='/usersServlet?key=selectbyid&userid="+uid+"'</script>");
}
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String key =req.getParameter("key");
switch(key){
case "adduser":
//执行新增方法
adduser(req,resp);
break;
case "deletebyid":
//执行假删除方法
deletebyid(req,resp);
break;
case "deleteuser":
//执行真删除方法
deleteuser(req,resp);
break;
case "loginout":
//执行退出方法
loginout(req,resp);
break;
case "login":
//执行登录方法
login(req,resp);
break;
case "selectbyid":
//执行id查询方法
selectbyid(req,resp);
break;
case "selectusers":
//执行全查方法
System.out.println("执行全查的方法--servlet");
selectusers(req,resp);
break;
case "updateuser":
//执行更新方法
updateuser(req,resp);
break;
}
}
}
修改页面请求名
success.jsp
<%@ page import="com.yhp.bean.Users" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Users u1 =(Users) session.getAttribute("u1");
%>
<h1>success.jsp,欢迎您:<%=u1==null?"":u1.getUserName()%>
<a href="/usersServlet?key=loginout">退出</a>
</h1>
<input type="button" value="查询用户列表" onclick="javascript:location.href='/usersServlet?key=selectusers&pageindex=1'">
</body>
</html>
list.jsp
<%@ page import="com.yhp.bean.Users" %>
<%@ page import="java.util.List" %>
<%@ page import="com.yhp.util.PageUtilPlus" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style type="text/css">
span{ border: 1px solid black}
a{ text-decoration: none}
</style>
</head>
<body>
<%
Users u1 =(Users) session.getAttribute("u1");
%>
<h1>list.jsp,欢迎您:<%=u1==null?"":u1.getUserName()%></h1>
<%
/* List<Users> ulist = (List<Users>)request.getAttribute("ulist");
int pindex=(Integer)request.getAttribute("pindex");
int totalcount = (Integer)request.getAttribute("totalcount");
int totalpages =(Integer) request.getAttribute("totalpages");*/
PageUtilPlus<Users> pu=(PageUtilPlus)request.getAttribute("pu");
//得到模糊查条件
String username = (String)request.getAttribute("username");
username=(username==null?"":username);
String usersex = (String)request.getAttribute("usersex");
usersex=(usersex==null?"":usersex);
%>
<div><input type="button" value="新增" onclick="javascript:location.href='add.jsp'"></div>
<div>
<form action="/usersServlet?key=selectusers" method="post">
姓名:<input type="text" name="uname" value="<%=username%>">
性别: <select name="usex">
<option value="noselect" <%="noselect".equals(usersex)?"selected":""%>>请选择</option>
<option value="男" <%="男".equals(usersex)?"selected":""%>>男</option>
<option value="女" <%="女".equals(usersex)?"selected":""%>>女</option>
</select>
<input type="submit" value="查询"/>
</form>
</div>
<table border="1" cellspacing="0" width="500">
<tr>
<td>用户编号</td>
<td>用户姓名</td>
<td>用户性别</td>
<td>用户年龄</td>
<td>用户密码</td>
<td>操作</td>
</tr>
<%for(Users u:pu.getDataList()){%>
<tr>
<td><%=u.getUserId()%></td>
<td><%=u.getUserName()%></td>
<td><%=u.getSex()%></td>
<td><%=u.getAge()%></td>
<td><%=u.getPassWord()%></td>
<td> <a href="/usersServlet?key=deleteuser&userid=<%=u.getUserId()%>">删除</a>
<a href="/usersServlet?key=deleteuser&userid=<%=u.getUserId()%>">假删除</a>
<a href="/usersServlet?key=selectbyid&userid=<%=u.getUserId()%>">修改</a> </td>
</tr>
<% } %>
<tr>
<td colspan="6">
<a href="/usersServlet?key=selectusers&pageindex=1&uname=<%=username%>&usex=<%=usersex%>">首页</a>
<a href="/usersServlet?key=selectusers&pageindex=<%=pu.getPageIndex()-1<=1?1:pu.getPageIndex()-1%>&uname=<%=username%>&usex=<%=usersex%>">上一页</a>
<%for(int i=1;i<=pu.getTotalPages();i++){%>
<a href="/usersServlet?key=selectusers&pageindex=<%=i%>&uname=<%=username%>&usex=<%=usersex%>"><span><%=i%></span></a>
<%}%>
<a href="/usersServlet?key=selectusers&pageindex=<%=pu.getPageIndex()+1>=pu.getTotalPages()?pu.getTotalPages():pu.getPageIndex()+1%>&uname=<%=username%>&usex=<%=usersex%>">下一页</a>
<a href="/usersServlet?key=selectusers&pageindex=<%=pu.getTotalPages()%>&uname=<%=username%>&usex=<%=usersex%>">尾页</a>
<br>
当前页:<%=pu.getPageIndex()%>,
总页数:<%=pu.getTotalPages()%>,
总条数:<%=pu.getTotalCount()%>
</td>
</tr>
</table>
</body>
</html>
update.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Users user = (Users) request.getAttribute("user");
%>
<h1>update.jsp</h1>
<form action="/usersServlet?key=updateuser" method="post">
userid:<input type="text" name="uid" readonly value="<%=user.getUserId()%>"><br>
username:<input type="text" name="uname" value="<%=user.getUserName()%>"><br>
sex:<input type="radio" name="usex" value="男" <%="男".equals(user.getSex())?"checked":""%>>男
<input type="radio" name="usex" value="女" <%="女".equals(user.getSex())?"checked":""%>>女 <br>
age:<input type="text" name="uage" value="<%=user.getAge()%>"><br>
password:<input type="text" name="upass" value="<%=user.getPassWord()%>"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
add.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>add.jsp</h1>
<form action="/usersServlet?key=adduser" method="post">
username:<input type="text" name="uname" ><br>
sex:<input type="radio" name="usex" value="男" >男
<input type="radio" name="usex" value="女" >女 <br>
age:<input type="text" name="uage" ><br>
password:<input type="text" name="upass" ><br>
<input type="submit" value="保存">
</form>
</body>
</html>
三:使用EL表达式JSTL标签库优化页面代码
原来jsp的问题
jsp使用小脚本嵌套了java代码,使得jsp既要展示数据,又要编写业务逻辑,嵌套java代码
优化方式:
使用EL表达式和JSTL标签库替代页面中的java代码
EL表达式
语法: ${key/变量名}
el表达式展示的数据,一定是来源于PageContext,request,Session,application这四个作用域中的
作用:展示数据
<%
pageContext.setAttribute("k1","pageContext的内容");
// Object obj=pageContext.getAttribute("k1");
Users users = new Users();
users.setUserName("赵丽颖");
users.setPassWord("123abc");
pageContext.setAttribute("u1",users);
//list集合
List list=new ArrayList();
list.add("abc");
list.add(123456);
list.add(users);
pageContext.setAttribute("datalist",list);
//map集合
Map map=new HashMap();
map.put("my","my_value");
pageContext.setAttribute("mymap",map);
// set -无序,只能使用循环遍历数据,需要结合jstl一起才能展示数据
%>
pageContext的内容是: ${k1}<br>
算术运算符:10+20=${10+20}<br/>
对象数据:username=${u1.userName},password=${u1.passWord}<br>
支持三目运算符:${u1.userName=="赵丽颖"?"我是赵丽颖":"我不是"}<br>
集合数据:${datalist[0]}--${datalist[1]}--${datalist[2].userName}<br>
map:${mymap.my}
ps:el如果读取过程中出现空值,则空值是空字符串:“”
作用域问题
<h1>当不同作用域中,存储相同key时,数据如何读取?</h1>
<%
pageContext.setAttribute("k2","pageContext的内容----k2");
session.setAttribute("k2","session的内容----k2");
application.setAttribute("k2","application的内容----k2");
request.setAttribute("k2","request的内容----k2");
//此时相同的key,el表达式在获取数据时,默认按照:pageContext->request->session->application 的范围顺序取值
//如果想要获得特定环境下的值,可以加作用域:pageScope,requestScope,sessionScopt,applicationScope
// ${作用域.key}
%>
<h1>k2=${applicationScope.k2}</h1>
支持数据类型的自动转换
原来:String str=(String) request.getAttribute("k1");
Integer.parseInt(str);
el表达式:${k1} -取出后,识别为数值
<%
pageContext.setAttribute("age","23");
%>
age=${age+10}
关于el表达式的范例
<%@ page import="com.yhp.bean.Users" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>el_text</title>
</head>
<body>
<%
pageContext.setAttribute("k1","pageContext内容");
// Object obj=pageContext.getAttribute("k1");
Users users = new Users();
users.setUsername("龙傲天");
users.setPassword("1234");
pageContext.setAttribute("u1",users);
//集合
List list=new ArrayList();
list.add("abc");
list.add(123456);
list.add(users);
pageContext.setAttribute("datalist",list);
//map集合
Map map=new HashMap();
map.put("my","my_value");
pageContext.setAttribute("mymap",map);
//set -无序,只能使用循环遍历数据,徐亚结合jstl一起才能展示数据
%>
pageContext的内容是:${k1}<br>
算数运算符:10+20=${10+20}<br/>
对象数据:username=${u1.username},password=${u1.password}<br>
支持三目运算符:${u1.username=="龙傲天"?"我是龙傲天":"我不是龙傲天"}<br>
集合数据 : ${datalist[0]}--${datalist[1]}--${datalist[2].username}<br>
map : ${mymap.my}
<h1>当不同作用域中,存储相同key时,数据如何读取?</h1>
<%
pageContext.setAttribute("k2","pageContext的内容-----k2");//1优先级
session.setAttribute("k2","session的内容-----k2");//3
application.setAttribute("k2","application的内容------k2");//4
request.setAttribute("k2","request的内容------k2");//2
//此时相同的key,el表达式在获取数据时,默认按照:pageContext->request->session->application 的范围顺序取值
//如果想要获得特定环境下的值,可以加作用域:pageScope,requestScope,sessionScopt,applicationScope
// ${作用域.key}
%>
<h1>k2=${applicationScope.k2}</h1>
<hr>
<%
pageContext.setAttribute("age","23");
%>
age=${age+10}
</body>
</html>
测试结果
JSTL标签库优化页面代码
该标签库主要的作用在于对页面中循环,判断结构的支持
使用步骤
1.添加依赖包
2.在页面中引入标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3. 标签库内容:判断<c:if test="判断条件">
<%
pageContext.setAttribute("age",26);
%>
<c:if test="${age<18}">
未成年
</c:if>
<c:if test="${age>=18 && age<30}">
青年
</c:if>
<c:if test="${age>=30 && age<40}">
壮年
</c:if>
判断-if-else结构:
<c:choose>
<c:when test="${age<18}">
when-未成年
</c:when>
<c:when test="${age<30}">
when-青年
</c:when>
<c:otherwise>
when-壮年
</c:otherwise>
</c:choose>
循环
<c:forEach items="被遍历的集合" var="每次取出的数据所存的变量名" varStatus=“自定义变量名” >
<%
Set set=new HashSet();
set.add("zhangsan");
set.add(123.78);
set.add(123);
pageContext.setAttribute("myset",set);
%>
<c:forEach items="${myset}" var="s" varStatus="sta">
${sta.index}==${sta.count}==>s=${s}<br>
</c:forEach>
varStatus 用来配置行号或下标
${sta.count}
${sta.index}
循环输出数值
<c:forEach begin="1" end="100" var="num">
${num},
</c:forEach>
JSTL案例
<%@ page import="java.util.Set" %>
<%@ page import="java.util.HashSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>jstl_text</title>
</head>
<body>
<h1>判断</h1>
<%
pageContext.setAttribute("age",29);
%>
<c:if test="${age<18}">
未成年
</c:if>
<c:if test="${age>=18&& age<30}">
青年
</c:if>
<c:if test="${age>=30 && age<40}">
壮年
</c:if>
<hr>
<c:choose>
<c:when test="${age<18}">
when-未成年
</c:when>
<c:when test="${age<30}">
when-青年
</c:when>
<c:otherwise>
when-壮年
</c:otherwise>
</c:choose>
<h1>循环</h1>
<%
Set set=new HashSet();
set.add("张三");
set.add(123.54);
set.add(123);
pageContext.setAttribute("myset",set);
%>
<c:forEach items="${myset}" var="s" varStatus="sta">
${sta.index}下标下的第${sta.count}个值==>s=${s}<br>
</c:forEach>
<h1>输出1-100的值</h1>
<c:forEach begin="1" end="100" var="num">
${num},
</c:forEach>
</body>
</html>
四:优化项目代码(优化小脚本)
success.jsp
<%@ page import="com.yhp.bean.Users" %>
<%@ page import="com.yhp.util.PeopleUtil" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--<%--%>
<%-- Users u1=(Users) session.getAttribute("u1");--%>
<%--%>--%>
<%-- <h1>登录成功,欢迎您:<%=u1==null?"":u1.getUsername()%>--%>
<h1>登录成功,欢迎您:${sessionScope.u1.username},当前在线人数:<%=PeopleUtil.PEOPLE_ON_LINE%>
<a href="/usersServlet?key=loginout">退出</a>
</h1>
<%--第一个参数用?拼接后面用&--%>
<input type="button" value="查询用户列表" onclick="javascript:location.href='/usersServlet?key=selectusers&pageIndex=1'">
</body>
</html>
list.jsp
</head>
<body>
<%--<%--%>
<%-- Users u1=(Users) session.getAttribute("u1");--%>
<%--%>--%>
<%--<h1>列表页面,欢迎您:<%=u1==null?"":u1.getUsername()%></h1>--%>
<h1>列表页面,欢迎您:${sessionScope.u1.username}
<a href="/usersServlet?key=loginout">退出</a></h1>
<%
// //得到模糊查条件 key=username,usersex
//分页数据: key=pu
%>
<div>
<input type="button" value="新增" onclick="javascript:location.href='add.jsp'">
</div>
<div>
<form action="/usersServlet?key=selectusers" method="post">
姓名:<input type="text" name="uname" value="${username}">
性别:<select name="usex">
<option value="请选择" ${usersex=="请选择"?"selected":""}>请选择</option>
<option value="男"${usersex=="男"?"selected":""}>男</option>
<option value="女"${usersex=="女"?"selected":""}>女</option>
</select>
<input type="submit" value="查询">
</form>
</div>
<table border="1" cellspacing="0" width="500">
<tr>
<td>用户编号</td>
<td>用户姓名</td>
<td>用户性别</td>
<td>用户年龄</td>
<td>用户密码</td>
<td>操作</td>
</tr>
<c:forEach items="${pu.dataList}" var="u">
<tr>
<td>${u.userid}</td>
<td>${u.username}</td>
<td>${u.sex}</td>
<td>${u.age}</td>
<td>${u.password}</td>
<td> <a href="/usersServlet?key=deleteuser&userid=${u.userid}">删除</a>
<a href="/usersServlet?key=deletebyid&userid=${u.userid}">假删除</a>
<a href="/usersServlet?key=selectbyid&userid=${u.userid}">修改</a> </td>
</tr>
</c:forEach>
<tr>
<td colspan="6">
<a href="/usersServlet?key=selectusers&pageindex=1&uname=${username}&usex=${usersex}">首页</a>
<a href="/usersServlet?key=selectusers&pageIndex=${pu.pageIndex-1<=1?1:pu.pageIndex-1}&uname=${username}&usex=${usersex}">上一页</a>
<c:forEach begin="1" end="${pu.totalPages}" var="i">
<a href="/usersServlet?key=selectusers&pageIndex=${i}&uname=${username}&usex=${usersex}">${i}</a>
</c:forEach>
<a href="/usersServlet?key=selectusers&pageIndex=${pu.pageIndex+1>=pu.totalPages?pu.totalPages:pu.pageIndex+1}&uname=${username}&usex=${usersex}">下一页</a>
<a href="/usersServlet?key=selectusers&pageIndex=${pu.totalPages}&uname=${username}&usex=${usersex}">尾页</a><br>
当前页:${pu.pageIndex},
总页数:${pu.totalPages},
总条数:${pu.totalCount}>
</td>
</tr>
</table>
</body>
</html>
update.jsp
<%@ page import="com.yhp.bean.Users"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--<%--%>
<%-- Users user= (Users) request.getAttribute("user");--%>
<%--%>--%>
<h1>update.jsp登录成功,欢迎您:${sessionScope.u1.username}
<a href="/usersServlet?key=loginout">退出</a></h1>
<form action="/usersServlet?key=updateuser" method="post">
userid:<input type="text" name="uid" readonly value="${user.userid}"><br>
username:<input type="text" name="uname" value="${user.username}"><br>
sex:<input type="radio" name="usex" value="男" ${"男"==user.sex?"checked":""}>男
<input type="radio" name="usex" value="女" ${"女"==user.sex?"checked":""}>女<br>
age:<input type="text" name="uage" value="${user.age}"><br>
password:<input type="text" name="upass" value="${user.password}"><br>
<input type="submit" value="提交按钮">
</form>
</body>
</html>
五:过滤器与监听器
过滤器一:统一编码方式
package com.yhp.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class MyFilter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter--1初始化方法");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter--1执行的方法--开始");
//设置编码类型
HttpServletRequest request=(HttpServletRequest)servletRequest;
request.setCharacterEncoding("utf-8");
//调取下一个filter或者servlet
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("filter--1执行的方法--结束");
}
@Override
public void destroy() {
System.out.println("filter--1销毁的方法");
}
}
过滤器二:提示用户登录
package com.yhp.filter;
import com.yhp.bean.Users;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyFilter02 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter--2初始化方法");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter--2执行的方法--开始");
//验证用户是否登录
//防止用户在未登录的情况下访问限定页面
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String uri = request.getRequestURI();//请求地址
System.out.println("uri=" + uri);
//活的session中的用户信息
Users users = (Users) request.getSession().getAttribute("u1");
if (users == null) {
//未登录,提示用户登录
//对一些资源放行
String key = request.getParameter("key");
if("index.jsp".endsWith(uri)||"login".equals(key)||"/favicin.ico".endsWith(uri)){
filterChain.doFilter(servletRequest, servletResponse);
} else {
//response.sendRedirect("index.jsp");死循环,重定向会修改页面地址
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}else {
filterChain.doFilter(servletRequest, servletResponse);//调取下一个filter或目标servlet
}
System.out.println("filter--2执行的方法--结束");
}
@Override
public void destroy () {
System.out.println("filter--2销毁的方法");
}
}
监听器:监听在线人数
package com.yhp.bean;
import com.yhp.util.PeopleUtil;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
//类名=表名,列名=属性名
public class Users implements HttpSessionBindingListener {
private Integer userid;
private String username;
private Integer age;
private String sex;
private String password;
private Integer status;
public Users() {
}
public Users(Integer userid, String username, Integer age, String sex, String password, Integer status) {
this.userid = userid;
this.username = username;
this.age = age;
this.sex = sex;
this.password = password;
this.status = status;
}
@Override
public String toString() {
return "Users{" +
"userid=" + userid +
", username='" + username + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", password='" + password + '\'' +
", status=" + status +
'}';
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override//当session和当前类对象绑定时,自动调取(session.setAttribute())
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("当session和当前类对象绑定");
PeopleUtil.PEOPLE_ON_LINE++;
}
@Override//当session和当前类对象解绑时,自动调取(session.setRemoveAttribute()或session.invalide())
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("当session和当前类对象解绑");
PeopleUtil.PEOPLE_ON_LINE--;
}
}
过滤器栈
允许多个过滤器同时存在,各自配置各自的作用代码
web.xml文件中filter和filter-mapping标签的顺序,决定了filter执行的顺序
xml配置文件
<?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">
<filter>
<filter-name>f1</filter-name>
<filter-class>
com.yhp.filter.MyFilter01
</filter-class>
</filter>
<filter-mapping>
<filter-name>f1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>f2</filter-name>
<filter-class>
com.yhp.filter.MyFilter02
</filter-class>
</filter>
<filter-mapping>
<filter-name>f2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.yhp.bean.Users</listener-class>
</listener>
</web-app>
过滤器执行顺序与在xml文件的顺序有关
六json+ajax
json对象与java对象之间的转换——使用工具类
package com.test;
//类名=表名,列名=属性名
public class Users {
private Integer userid;
private String username;
private Integer age;
private String sex;
private String password;
private Integer status;
public Users() {
}
public Users(Integer userid, String username, Integer age, String sex, String password, Integer status) {
this.userid = userid;
this.username = username;
this.age = age;
this.sex = sex;
this.password = password;
this.status = status;
}
@Override
public String toString() {
return "Users{" +
"userid=" + userid +
", username='" + username + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", password='" + password + '\'' +
", status=" + status +
'}';
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.test;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class Testjson {
public static void main(String[] args) {
//单个对象
Users users1=new Users(1,"张三",18,"男","1111",0);
//把这个java对象转成json格式
JSONObject jsonObject = JSONObject.fromObject(users1);
System.out.println(jsonObject);
//json转换成java
String str = "{'age':18,'password':'1111','sex':'男','status':0,'userid':1,'username':'张三'}";
JSONObject json_str = JSONObject.fromObject(str);
Users o = (Users) JSONObject.toBean(json_str, Users.class);
System.out.println("o="+o);
//对象集合
List list=new ArrayList();
for (int i =0;i<3;i++){
Users u = new Users(1+i,"张三"+i,18+i,"男","1111",0);
list.add(u);
}
//list-->json
JSONArray jsonArray = JSONArray.fromObject(list);
System.out.println("jsonArray="+jsonArray);
//json-->list
System.out.println("-----------------");
String arraystr="[{'age':18,'password':'1111','sex':'男','status':0,'userid':1,'username':'张三0'},"+
"{'age':19,'password':'1111','sex':'男','status':0,'userid':2,'username':'张三1'},"+
"{'age':20,'password':'1111','sex':'男','status':0,'userid':3,'username':'张三2'},]\n";
JSONArray json_array = JSONArray.fromObject(arraystr);
List<Users> ulist = (List<Users>) JSONArray.toCollection(json_array, Users.class);
for (Users users : ulist) {
System.out.println(users);
}
}
}
阿贾克斯ajax
同步与异步的区别
案例:验证用户名是否存在
package com.yhp.web;
import com.yhp.service.UsersService;
import com.yhp.service.impl.UsersServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/chekuname")
public class ChekUserNameServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接参数
String uname = req.getParameter("uname");
//判断该名字是否存在
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
//验证用户名是否存在的方法
UsersService usersService=new UsersServiceImpl();
boolean checkuser = usersService.checkuser(uname);
if (checkuser){
//用户名已经存在
//在使用ajax时不需要考虑调页面,默认调回ajax发送的页面
writer.print("用户名已存在");
}else {
//用户名可用
writer.print("用户名可用");
}
}
}
项目优化:验证用户名是否存在
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function () {
$("#username").blur(function(){//当用户名失去焦点时
//1.获取用户输入的信息
var sname = $(this).val();
//2.将这个value值发送给服务器,去做验证
$.ajax({
url:"/chekuname",//请求地址
type:"post",//请求方式
data:"uname="+sname,//传输的数据
dataType:"text",//返回的格式
//returndata是自定义参数变量,用来接收返回的结果
success:function (returndata) {//执行成功后的回调函数
$("#rs").html(returndata)
}
});
});
})
</script>
<style type="text/css">
span{color: #ff0000
}
</style>
</head>
<body>
<h1>add.jsp登录成功,欢迎您:${sessionScope.u1.username}
<a href="/usersServlet?key=loginout">退出</a>></h1>
<form action="/usersServlet?key=adduser" method="post">
username:<input type="text" id="username" name="uname"><span id="rs"></span><br>
sex:<input type="radio" name="usex" value="男">男
<input type="radio" name="usex" value="女">女<br>
age:<input type="text" name="uage"><br>
password:<input type="text" name="upass"><br>
<input type="submit" value="保存">
</form>
</body>
</html>
在数据层,业务层添加方法与实现类
package com.yhp.dao;
import com.yhp.bean.Users;
import java.util.List;
public interface UsersDao {
//登录方法(根据用户名和密码查询用户信息)
public Users login(String username,String pass);
//查询全部
public List<Users> selectALL(int pageIndex,int size,String uname,String usex);
//查询总条数
public int totalCount(String uname,String usex);
//删除(根据userid)
public int deleteUser(int userid);
//假删除(根据userid)
public int deleteByid(int userid);
//主键查询
public Users selectbyid(int userid);
//更新
public int UpdateUser(Users users);
//添加(新增)用户
public int insert(Users users);
//用户名已经存在
public boolean checkuser(String name);
}
package com.yhp.service;
import com.yhp.bean.Users;
import java.util.List;
public interface UsersService {
//登录方法(根据用户名和密码查询用户信息)
public Users login(String username, String pass);
//查询全部(参数:页码值,每页显示条数,模糊查询条件1.模糊查询条件2)
public List<Users> selectALL(int pageIndex,int size,String uname,String usex);
//查询总条数
public int totalCount(String uname,String usex);
//删除(根据userid)
public int deleteUser(int userid);
//假删除(根据userid)
public int deleteByid(int userid);
//主键查询
public Users selectbyid(int userid);
//更新
public int UpdateUser(Users users);
//添加(新增)用户
public int insert(Users users);
//用户名已经存在
public boolean checkuser(String name);
}
package com.yhp.service.impl;
import com.yhp.bean.Users;
import com.yhp.dao.UsersDao;
import com.yhp.dao.impl.UsersDaoImpl;
import com.yhp.service.UsersService;
import java.util.List;
public class UsersServiceImpl implements UsersService {
UsersDao usersDao =new UsersDaoImpl();
@Override
public Users login(String username, String pass) {
return usersDao.login(username,pass);
}
@Override
public List<Users> selectALL(int pageindex,int size,String uname,String usex) {
return usersDao.selectALL(pageindex,size,uname,usex);
}
@Override
public int totalCount(String uname,String usex) {
return usersDao.totalCount(uname,usex);
}
@Override
public int deleteUser(int userid) {
return usersDao.deleteUser(userid);
}
@Override
public int deleteByid(int userid) {
return usersDao.deleteByid(userid);
}
@Override
public Users selectbyid(int userid) {
return usersDao.selectbyid(userid);
}
@Override
public int UpdateUser(Users users) {
return usersDao.UpdateUser(users);
}
@Override
public int insert(Users users) {
return usersDao.insert(users);
}
@Override
public boolean checkuser(String name) {
return usersDao.checkuser(name);
}
}
dao实现类
@Override
public boolean checkuser(String name) {
try {
String sql="select * from users where username=?";
List params=new ArrayList();
params.add(name);
resultSet=selectDB(sql,params);
if (resultSet.next()){
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeAll();
}
return false;
}