[JavaWeb学习日记]JSP+Cookie+Filter与登录+CRUD案例

目录

 一.JSP

二.EL表达式与JSTL标签

三.Cookie

四.Session

五.Filter 

六. 登录+CRUD:品牌增删改查案例

Demo一览

1.导包

2.构建包结构

3.创建数据库表tb_brand与user

4.创建实体类

5.mybatis的配置文件和logback配置文件

6.写接口

7.工具类:生成图片与SqlSession创建 

8.写service方法

 9.css

10. Filter过滤器限制必须登录

 11.index.jsp,login.jsp与register.jsp

 12.登录注册的Servlet

 13.增删改查有关的jsp与Servlet


如今JSP已不再是热门的前端工具,不建议深入学习,而Cookie与Filter可以了解了解

通过maven建立web工程,工程目录如下,学习的内容为java代码以及两个jsp文件

pom需要导入的依赖:

    <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><!--使用jsp需要导入的包--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><!--使用jstl标签需要导入的两个包--><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency>


 一.JSP

1.JSP(JavaServerPages):既可以写html,又能写java代码会把jsp文件转换为java文件并编译执行,本质为Servlet服务资源
2.使用在jsp中引用别的类:需要导包
3.在jsp文件中写java代码:<%xxx%>
4.插入数据到前端代码上:<%=xxx%>

index.jsp: 

<%@ page import="org.example.pojo.Brand" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<%List<Brand> brands = new ArrayList<>();System.out.println("HelloJSP!");String str="JSP!";
%>
<%="你好,"+str%><br>
</body>
</html>

IDE控制台与浏览器都会有输出


二.EL表达式与JSTL标签

案例:获取servlet传过来的集合对象中的数据
EL表达式:主要功能为获取在请求转发/cookie/session中存储的键为XXX的数据
JSTL:用标签替换JSP上面的java代码,如判断与循环
1.使用EL表达式开启需要声明:<%@page isELIgnored="false" %>jsp文件中使用el表达式获取数据:${xxx}
2.使用jstl标签需要1.pom文件导包2.引入taglib标签:<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>3.常见的jstl标签:c:if与c:forEach
3.c:if标签指定判断条件:test属性
4.c:foreach标签指定1.遍历的数据:items属性2.遍历数据中单个元素的名字:var属性(var.xxx会调用该对象的类中对应的getXxx方法)3.遍历过程中的序号名:varStatus属性varStatus的属性:index从0开始计数|count从1开始计数4.指定遍历时设置var的开始,结束,步长:begin,end,step

jstl.jsp:

<%@page isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title></head>
<body>
<c:if test="true"><h3>true</h3></c:if>
<c:if test="${status==1}"><h3>${status}</h3></c:if>
<table border="1" cellspacing="0" width="800"><c:forEach items="${brands}" var="brand" varStatus="status"><tr align="center"><td>${status.count}</td><td>${brand.brandName}></td><td>${brand.companyName}></td><td>${brand.ordered}</td><td>${brand.description}</td><td><c:if test="${brand.status==1}"><%="启用"%></c:if><c:if test="${brand.status==0}"><%="禁用"%></c:if></td><td><a href="">修改 </a><a href="">删除</a></td></tr></c:forEach>
</table>
<hr>
<c:forEach begin="1" end="10" step="1" var="i"><a href="">${i}</a>
</c:forEach>
</body>
</html>
public class Brand {private Integer id;private String brandName;private String companyName;private Integer ordered;private String description;private Integer status;public Brand() {}public Brand(Integer id, String brandName, String companyName, String description) {this.id = id;this.brandName = brandName;this.companyName = companyName;this.description = description;}public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) {this.id = id;this.brandName = brandName;this.companyName = companyName;this.ordered = ordered;this.description = description;this.status = status;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getBrandName() {return brandName;}public void setBrandName(String brandName) {this.brandName = brandName;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName = companyName;}public Integer getOrdered() {return ordered;}public void setOrdered(Integer ordered) {this.ordered = ordered;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}@Overridepublic String toString() {return "Brand{" +"id=" + id +", brandName='" + brandName + '\'' +", companyName='" + companyName + '\'' +", ordered=" + ordered +", description='" + description + '\'' +", status=" + status +'}';}
}

 Servlet: 把数据存储到request域中,再转发到jsp资源中。


@WebServlet("/jsp")
public class JSPDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {List<Brand> brands = new ArrayList<>();brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));request.setAttribute("status",1);request.setAttribute("brands",brands);request.getRequestDispatcher("/jstl.jsp").forward(request,response);}
}


三.Cookie

会话跟踪:HTTP协议每次向浏览器请求数据时,会将该请求视为新请求
服务器需要识别多次请求是否来自同一浏览器以便在多次请求间共享数据
1.查看cookies:谷歌控制台application
2.Cookies的实现基于HTTP协议(响应头,请求头),Session基于cookie实现(发送sessionId)
3.发送cookie:以键值对的形式创建cookie,使用响应对象添加cookie
4.设置cookie对象的在浏览器中的存活时间:单位为秒,cookie默认为浏览器关闭cookie消失
5.接收cookie:通过请求对象接收所有cookie数组并遍历
@WebServlet("/cookie")
public class CookieDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Cookie cookie = new Cookie("username", "zhangsan");cookie.setMaxAge(60);response.addCookie(cookie);Cookie[] cookies = request.getCookies();for (Cookie c : cookies) {System.out.println(c.getName() + ":" + c.getValue());}}
}

访问目标路径两次得到如下结果: 


四.Session

1.存Session:通过请求对象存储数据到Session中
2.获取session对象中对应键的值,后移除键值对
3.在web.xml中设置session存活时间
@WebServlet("/session")
public class SessionDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response){HttpSession session=request.getSession();session.setAttribute("username","zhangsan");System.out.println(session.getAttribute("username"));session.removeAttribute("username");}
}

web.xml:

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><session-config><!--单位分钟--><session-timeout>1</session-timeout></session-config>
</web-app>


五.Filter 

用于拦截访问的资源

//拦截资源目录,和@WebServlet一样的写法
@WebFilter("/session")
public class FilterDemo implements Filter {public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("拦截资源后放行......");filterChain.doFilter(servletRequest,servletResponse);System.out.println("放行后输出......");}public void init(FilterConfig filterConfig) {}public void destroy() {}
}


六. 登录+CRUD:品牌增删改查案例

Demo一览

1.导包
    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency>

2.构建包结构

3.创建数据库表tb_brand与user
4.创建实体类
public class Brand {private Integer id;private String brandName;private String companyName;private Integer ordered;private String description;private Integer status;public Brand() {}public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) {this.id = id;this.brandName = brandName;this.companyName = companyName;this.ordered = ordered;this.description = description;this.status = status;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getBrandName() {return brandName;}public void setBrandName(String brandName) {this.brandName = brandName;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName = companyName;}public Integer getOrdered() {return ordered;}public void setOrdered(Integer ordered) {this.ordered = ordered;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}@Overridepublic String toString() {return "Brand{" +"id=" + id +", brandName='" + brandName + '\'' +", companyName='" + companyName + '\'' +", ordered=" + ordered +", description='" + description + '\'' +", status=" + status +'}';}
}
public class User {private Integer id;private String username;private String password;public User() {}public User(String username, String password) {this.username = username;this.password = password;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

5.mybatis的配置文件和logback配置文件

mybatis.config

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><package name="org.example.pojo"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///db1?useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><package name="org.example.mapper"/></mappers>
</configuration>

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration><appender name="Console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>[%level] %boldGreen(%logger{15}) - %msg %n</pattern></encoder></appender><root level="DEBUG"><appender-ref ref="Console"/></root>
</configuration>

BrandMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.BrandMapper"><resultMap id="brandResultMap" type="Brand"><id column="id" property="id"/><result column="brand_name" property="brandName"/><result column="company_name" property="companyName"/></resultMap>
</mapper>

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.UserMapper">
</mapper>

6.写接口
public interface BrandMapper {@ResultMap("brandResultMap")@Select("select * from tb_brand")List<Brand> selectAll();@Insert("insert into tb_brand values (null,#{brandName},#{companyName},#{ordered},#{description},#{status})")void add(Brand brand);@ResultMap("brandResultMap")@Select("select * from tb_brand where id=#{id}")Brand selectById(int id);@Update("update tb_brand set brand_name=#{brandName}," +"company_name=#{companyName}," +"ordered=#{ordered}," +"description=#{description}," +"status=#{status} " +"where id=#{id}")void update(Brand brand);@Delete("delete from tb_brand where id=#{id}")void deleteById(int id);
}
public interface UserMapper {@Select("select * from user where username = #{username} and password = #{password}")User select(@Param("username") String username, @Param("password") String password);@Select("select * from user where username = #{username}")User selectByUsername(String username);@Insert("insert into user values(null,#{username},#{password})")void add(User user);
}

7.工具类:生成图片与SqlSession创建 
public class  CheckCodeUtil {//生成验证码工具类public static final String VERIFY_CODES = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";private static Random random = new Random();public static void main(String[] args) throws Exception{OutputStream fos=new FileOutputStream("D:\\IDEACode\\demo2\\Web\\web-demo4-brandDemo\\src\\main\\webapp\\imgs\\a.jpg");String checkCode=CheckCodeUtil.outputVerifyImage(100,50,fos,4);System.out.println(checkCode);}//输出随机验证码图片流,并返回验证码值(一般传入输出流,响应response页面端,Web项目用的较多)//图片宽高,输出流与数据长度//返回验证码数据public static String outputVerifyImage(int w, int h, OutputStream os, int verifySize) throws IOException {String verifyCode = generateVerifyCode(verifySize);outputImage(w, h, os, verifyCode);return verifyCode;}//使用系统默认字符源生成验证码public static String generateVerifyCode(int verifySize) {return generateVerifyCode(verifySize, VERIFY_CODES);}//使用指定源生成验证码public static String generateVerifyCode(int verifySize, String sources) {// 未设定展示源的字码,赋默认值大写字母+数字if (sources == null || sources.length() == 0) {sources = VERIFY_CODES;}int codesLen = sources.length();Random rand = new Random(System.currentTimeMillis());StringBuilder verifyCode = new StringBuilder(verifySize);for (int i = 0; i < verifySize; i++) {verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1)));}return verifyCode.toString();}//生成随机验证码文件,并返回验证码值 (生成图片形式,用的较少)public static String outputVerifyImage(int w, int h, File outputFile, int verifySize) throws IOException {String verifyCode = generateVerifyCode(verifySize);outputImage(w, h, outputFile, verifyCode);return verifyCode;}//生成指定验证码图像文件public static void outputImage(int w, int h, File outputFile, String code) throws IOException {if (outputFile == null) {return;}File dir = outputFile.getParentFile();//文件不存在if (!dir.exists()) {//创建dir.mkdirs();}try {outputFile.createNewFile();FileOutputStream fos = new FileOutputStream(outputFile);outputImage(w, h, fos, code);fos.close();} catch (IOException e) {throw e;}}//输出指定验证码图片流public static void outputImage(int w, int h, OutputStream os, String code) throws IOException {int verifySize = code.length();BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);Random rand = new Random();Graphics2D g2 = image.createGraphics();g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 创建颜色集合,使用java.awt包下的类Color[] colors = new Color[5];Color[] colorSpaces = new Color[]{Color.WHITE, Color.CYAN,Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,Color.PINK, Color.YELLOW};float[] fractions = new float[colors.length];for (int i = 0; i < colors.length; i++) {colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];fractions[i] = rand.nextFloat();}Arrays.sort(fractions);// 设置边框色g2.setColor(Color.GRAY);g2.fillRect(0, 0, w, h);Color c = getRandColor(200, 250);// 设置背景色g2.setColor(c);g2.fillRect(0, 2, w, h - 4);// 绘制干扰线Random random = new Random();// 设置线条的颜色g2.setColor(getRandColor(160, 200));for (int i = 0; i < 20; i++) {int x = random.nextInt(w - 1);int y = random.nextInt(h - 1);int xl = random.nextInt(6) + 1;int yl = random.nextInt(12) + 1;g2.drawLine(x, y, x + xl + 40, y + yl + 20);}// 添加噪点// 噪声率float yawpRate = 0.05f;int area = (int) (yawpRate * w * h);for (int i = 0; i < area; i++) {int x = random.nextInt(w);int y = random.nextInt(h);// 获取随机颜色int rgb = getRandomIntColor();image.setRGB(x, y, rgb);}// 添加图片扭曲shear(g2, w, h, c);g2.setColor(getRandColor(100, 160));int fontSize = h - 4;Font font = new Font("Algerian", Font.ITALIC, fontSize);g2.setFont(font);char[] chars = code.toCharArray();for (int i = 0; i < verifySize; i++) {AffineTransform affine = new AffineTransform();affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize / 2, h / 2);g2.setTransform(affine);g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10);}g2.dispose();ImageIO.write(image, "jpg", os);}private static Color getRandColor(int fc, int bc) {//随机颜色if (fc > 255) {fc = 255;}if (bc > 255) {bc = 255;}int r = fc + random.nextInt(bc - fc);int g = fc + random.nextInt(bc - fc);int b = fc + random.nextInt(bc - fc);return new Color(r, g, b);}private static int getRandomIntColor() {int[] rgb = getRandomRgb();int color = 0;for (int c : rgb) {color = color << 8;color = color | c;}return color;}private static int[] getRandomRgb() {int[] rgb = new int[3];for (int i = 0; i < 3; i++) {rgb[i] = random.nextInt(255);}return rgb;}private static void shear(Graphics g, int w1, int h1, Color color) {shearX(g, w1, h1, color);shearY(g, w1, h1, color);}private static void shearX(Graphics g, int w1, int h1, Color color) {int period = random.nextInt(2);boolean borderGap = true;int frames = 1;int phase = random.nextInt(2);for (int i = 0; i < h1; i++) {double d = (double) (period >> 1)* Math.sin((double) i / (double) period+ (6.2831853071795862D * (double) phase)/ (double) frames);g.copyArea(0, i, w1, 1, (int) d, 0);if (borderGap) {g.setColor(color);g.drawLine((int) d, i, 0, i);g.drawLine((int) d + w1, i, w1, i);}}}private static void shearY(Graphics g, int w1, int h1, Color color) {int period = random.nextInt(40) + 10; // 50;boolean borderGap = true;int frames = 20;int phase = 7;for (int i = 0; i < w1; i++) {double d = (double) (period >> 1)* Math.sin((double) i / (double) period+ (6.2831853071795862D * (double) phase)/ (double) frames);g.copyArea(i, 0, 1, h1, 0, (int) d);if (borderGap) {g.setColor(color);g.drawLine(i, (int) d, i, 0);g.drawLine(i, (int) d + h1, i, h1);}}}
}
public class SqlSessionFactoryUtil {static SqlSessionFactory sqlSessionFactory;static { try {sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));}catch (Exception e){e.printStackTrace();}}public static SqlSessionFactory getssf(){return sqlSessionFactory;}
}

8.写service方法
public class BrandService {SqlSessionFactory sqlSessionFactory= SqlSessionFactoryUtil.getssf();public List<Brand> selectAll(){SqlSession sqlSession=sqlSessionFactory.openSession(true);BrandMapper mapper =sqlSession.getMapper(BrandMapper.class);List<Brand> brands=mapper.selectAll();sqlSession.close();return brands;}public void add(Brand brand){SqlSession sqlSession=sqlSessionFactory.openSession(true);BrandMapper mapper =sqlSession.getMapper(BrandMapper.class);mapper.add(brand);sqlSession.close();}public Brand selectById(int id){//更新数据时回显数据SqlSession sqlSession=sqlSessionFactory.openSession(true);BrandMapper mapper =sqlSession.getMapper(BrandMapper.class);Brand brand=mapper.selectById(id);sqlSession.close();return brand;}public void update(Brand brand){SqlSession sqlSession=sqlSessionFactory.openSession(true);BrandMapper mapper =sqlSession.getMapper(BrandMapper.class);mapper.update(brand);sqlSession.close();}public void deleteById(int id){SqlSession sqlSession=sqlSessionFactory.openSession(true);BrandMapper mapper =sqlSession.getMapper(BrandMapper.class);mapper.deleteById(id);sqlSession.close();}
}
public class UserService {SqlSessionFactory sqlSessionFactory= SqlSessionFactoryUtil.getssf();public User login(String username, String password){//登录需要设置cookie给浏览器,需要返回用户对象SqlSession sqlSession=sqlSessionFactory.openSession(true);UserMapper mapper=sqlSession.getMapper(UserMapper.class);User user=mapper.select(username,password);sqlSession.close();return user;}public boolean register(User user){SqlSession sqlSession=sqlSessionFactory.openSession(true);UserMapper mapper=sqlSession.getMapper(UserMapper.class);User u=mapper.selectByUsername(user.getUsername());if(u==null){mapper.add(user);}sqlSession.close();return u==null;}
}

 9.css

login.css

* {margin: 0;padding: 0;
}html {height: 100%;width: 100%;overflow: hidden;margin: 0;padding: 0;background: url(../imgs/Desert1.jpg) no-repeat 0px 0px;background-repeat: no-repeat;background-size: 100% 100%;-moz-background-size: 100% 100%;
}body {display: flex;align-items: center;justify-content: center;height: 100%;
}#loginDiv {width: 37%;display: flex;justify-content: center;align-items: center;height: 380px;background-color: rgba(75, 81, 95, 0.3);box-shadow: 7px 7px 17px rgba(52, 56, 66, 0.5);border-radius: 5px;
}#name_trip {margin-left: 50px;color: red;
}p {margin-top: 30px;margin-left: 20px;color: azure;
}#remember{margin-left: 15px;border-radius: 5px;border-style: hidden;background-color: rgba(216, 191, 216, 0.5);outline: none;padding-left: 10px;height: 20px;width: 20px;
}
#username{width: 200px;margin-left: 15px;border-radius: 5px;border-style: hidden;height: 30px;background-color: rgba(216, 191, 216, 0.5);outline: none;color: #f0edf3;padding-left: 10px;
}
#password{width: 202px;margin-left: 15px;border-radius: 5px;border-style: hidden;height: 30px;background-color: rgba(216, 191, 216, 0.5);outline: none;color: #f0edf3;padding-left: 10px;
}
.button {border-color: cornsilk;background-color: rgba(100, 149, 237, .7);color: aliceblue;border-style: hidden;border-radius: 5px;width: 100px;height: 31px;font-size: 16px;
}#subDiv {text-align: center;margin-top: 30px;
}
#loginMsg{text-align: center;color: aliceblue;
}
#errorMsg{text-align: center;color:red;
}

register.css

* {margin: 0;padding: 0;list-style-type: none;
}
.reg-content{padding: 30px;margin: 3px;
}
a, img {border: 0;
}body {background-image: url("../imgs/reg_bg_min.jpg") ;text-align: center;
}table {border-collapse: collapse;border-spacing: 0;
}td, th {padding: 0;height: 90px;}
.inputs{vertical-align: top;
}.clear {clear: both;
}.clear:before, .clear:after {content: "";display: table;
}.clear:after {clear: both;
}.form-div {background-color: rgba(255, 255, 255, 0.27);border-radius: 10px;border: 1px solid #aaa;width: 424px;margin-top: 150px;margin-left:1050px;padding: 30px 0 20px 0px;font-size: 16px;box-shadow: inset 0px 0px 10px rgba(255, 255, 255, 0.5), 0px 0px 15px rgba(75, 75, 75, 0.3);text-align: left;
}.form-div input[type="text"], .form-div input[type="password"], .form-div input[type="email"] {width: 268px;margin: 10px;line-height: 20px;font-size: 16px;
}.form-div input[type="checkbox"] {margin: 20px 0 20px 10px;
}.form-div input[type="button"], .form-div input[type="submit"] {margin: 10px 20px 0 0;
}.form-div table {margin: 0 auto;text-align: right;color: rgba(64, 64, 64, 1.00);
}.form-div table img {vertical-align: middle;margin: 0 0 5px 0;
}.footer {color: rgba(64, 64, 64, 1.00);font-size: 12px;margin-top: 30px;
}.form-div .buttons {float: right;
}input[type="text"], input[type="password"], input[type="email"] {border-radius: 8px;box-shadow: inset 0 2px 5px #eee;padding: 10px;border: 1px solid #D4D4D4;color: #333333;margin-top: 5px;
}input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focus {border: 1px solid #50afeb;outline: none;
}input[type="button"], input[type="submit"] {padding: 7px 15px;background-color: #3c6db0;text-align: center;border-radius: 5px;overflow: hidden;min-width: 80px;border: none;color: #FFF;box-shadow: 1px 1px 1px rgba(75, 75, 75, 0.3);
}input[type="button"]:hover, input[type="submit"]:hover {background-color: #5a88c8;
}input[type="button"]:active, input[type="submit"]:active {background-color: #5a88c8;
}
.err_msg{color: red;padding-right: 170px;
}
#password_err,#tel_err{padding-right: 195px;
}#reg_btn{margin-right:50px; width: 285px; height: 45px; margin-top:20px;
}#checkCode{width: 100px;
}#changeImg{color: aqua;
}

10. Filter过滤器限制必须登录
设置放行资源:通过获取的路径来判断是否包含目标字符串
检测用户是否登录:判断session里面是否有user
@WebFilter("/*")
public class LoginFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {HttpServletRequest req = (HttpServletRequest) request;String[] urls = {"/css/", "/img/", "/login.jsp", "/register.jsp", "/loginServlet", "registerServlet", "/checkCodeServlet"};String uri=req.getRequestURI();for (String u : urls) {if (uri.contains(u)||"/web_demo4_brandDemo_war/".equals(uri)) {System.out.println("[DEBUG]请求服务器资源..."+uri);chain.doFilter(request, response);return;}}if (req.getSession().getAttribute("user") == null) {System.out.println("[DEBUG]用户未登录访问数据资源,携带提示信息返回登录界面...");req.setAttribute("login_msg", "您尚未登陆");req.getRequestDispatcher("/login.jsp").forward(request, response);return;}System.out.println("[DEBUG]用户合法访问服务器资源..."+uri);chain.doFilter(request, response);}@Overridepublic void destroy() {}
}

 11.index.jsp,login.jsp与register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
</body>
<script>location.href="/web_demo4_brandDemo_war/login.jsp"
</script>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isELIgnored="false" %>
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>login</title><link href="css/login.css" rel="stylesheet">
</head><body><div id="loginDiv" style="height: 350px"><form action="/web_demo4_brandDemo_war/loginServlet" id="form" method="post"><h1 id="loginMsg">LOGIN IN</h1><%--el表达式获取请求转发中的提示信息--%><div id="errorMsg">${login_msg}${register_msg}</div><%--el表达式也可以获取cookie--%><p>Username:<input id="username" name="username" type="text" value="${cookie.username.value}"></p><p>Password:<input id="password" name="password" type="password" value="${cookie.password.value}"></p><p>Remember:<input id="remember" name="remember" value="on" type="checkbox"></p><div id="subDiv"><input type="submit" class="button" value="login up"><input type="reset" class="button" value="reset"><a href="register.jsp">没有账号?</a></div></form></div>
</body></html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isELIgnored="false" %>
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>欢迎注册</title><link href="css/register.css" rel="stylesheet">
</head><body><div class="form-div"><div class="reg-content"><h1>欢迎注册</h1><span>已有帐号?</span> <a href="login.jsp">登录</a></div><form id="reg-form" action="/web_demo4_brandDemo_war/registerServlet" method="post"><table><tr><td>用户名</td><td class="inputs"><input name="username" type="text" id="username"><br><span id="username_exi" class="err_msg" style="display: none">用户已存在</span><br><span id="username_err" class="err_msg">${register_msg}</span></td></tr><tr><td>密码</td><td class="inputs"><input name="password" type="password" id="password"><br><span id="password_err" class="err_msg" style="display: none">密码格式有误</span></td></tr><tr><td>验证码</td><td class="inputs"><input name="checkCode" type="text" id="checkCode"><%--访问图片生成服务请求图片资源--%><img id="checkImg" src="/web_demo4_brandDemo_war/checkCodeServlet"><a href="" id="changeImg">看不清?</a></td></tr></table><div class="buttons"><input value="注 册" type="submit" id="reg_btn"></div><br class="clear"></form></div>
</body>
<script>//在这里如果不加后面的问号与数据,点击图片不会改变changeImg= function () {document.getElementById("checkImg").src = "/web_demo4_brandDemo_war/checkCodeServlet?" + new Date().getMilliseconds();}document.getElementById("changeImg").onclick = changeImgdocument.getElementById("checkImg").onclick = changeImg
</script></html>


 12.登录注册的Servlet

生成图片:通过响应数据的输出流生成图片,并且把验证码设置为Session的键值对

@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {String checkCode= CheckCodeUtil.outputVerifyImage(100,50,response.getOutputStream(),4);System.out.println("[DEBUG]验证码为:"+checkCode);System.out.println("[DEBUG]返回生成的图片...");request.getSession().setAttribute("checkCodeGen",checkCode);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");String username=request.getParameter("username");String password=request.getParameter("password");User user=new UserService().login(username,password);if (user==null){System.out.println("[DEBUG]登录失败,携带提示消息登陆界面...");request.setAttribute("login_msg","用户名密码错误");request.getRequestDispatcher("/login.jsp").forward(request,response);return;}System.out.println("[DEBUG]登录成功,添加session,跳转到查询界面...");if("on".equals(request.getParameter("remember"))) {System.out.println("[DEBUG]用户点击了记住我,添加cookie...");Cookie[] cookies = {new Cookie("username",username),new Cookie("password",username)};for (Cookie cookie : cookies) {cookie.setMaxAge(60);response.addCookie(cookie);}}request.getSession().setAttribute("user",user);response.sendRedirect(request.getContextPath()+"/selectAllServlet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");if(!((String)request.getSession().getAttribute("checkCodeGen")).equalsIgnoreCase(request.getParameter("checkCode"))){System.out.println("[DEBUG]验证码错误,携带提示信息返回注册界面...");request.setAttribute("register_msg","验证码错误");request.getRequestDispatcher("/register.jsp").forward(request,response);return;}boolean flag=new UserService().register(new User(request.getParameter("username"),request.getParameter("password")));if(flag){System.out.println("[DEBUG]用户注册成功,携带提示消息返回登录界面...");request.setAttribute("register_msg","注册成功,请登录");request.getRequestDispatcher("/login.jsp").forward(request,response);}else {System.out.println("[DEBUG]用户登录失败,携带提示消息返回注册界面...");request.setAttribute("register_msg","用户名已存在,注册失败");request.getRequestDispatcher("/register.jsp").forward(request,response);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

 13.增删改查有关的jsp与Servlet

brand.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isELIgnored="false" %>
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Title</title>
</head><body><h2>${user.username},欢迎您</h2><br><input type="button" value="新增" id="add"><br><hr><table border="1" cellspacing="0" width="800"><tr><th>序号</th><th>品牌名称</th><th>企业名称</th><th>排序</th><th>品牌介绍</th><th>状态</th><th>操作</th></tr><c:forEach items="${brands}" var="brand" varStatus="status"><tr align="center"><td>${status.count}</td><td>${brand.brandName}</td><td>${brand.companyName}</td><td>${brand.ordered}</td><td>${brand.description}</td><c:if test="${brand.status==1}"><td><%="启用"%></td></c:if><c:if test="${brand.status==0}"><td><%="禁用"%></td></c:if><td><a href="/web_demo4_brandDemo_war/selectByIdServlet?id=${brand.id}">修改</a><a href="/web_demo4_brandDemo_war/deleteServlet?id=${brand.id}">删除</a></td></tr></c:forEach></table>
</body>
<script>document.getElementById("add").onclick = function () {location.href = "/web_demo4_brandDemo_war/addBrand.jsp";}
</script>
</html>
@WebServlet("/selectAllServlet")
public class SelectAllServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("[DEBUG]查询并显示所有数据...");request.setAttribute("brands",new BrandService().selectAll());request.getRequestDispatcher("/brand.jsp").forward(request,response);}//这里的doPost在jsp中不访问,但最好写,如果别的资源使用post方式请求转发@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
@WebServlet("/deleteServlet")
public class DeleteServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("[DEBUG]用户选择删除数据...");req.setCharacterEncoding("UTF-8");new BrandService().deleteById(Integer.parseInt(req.getParameter("id")));;resp.sendRedirect("/web_demo4_brandDemo_war/selectAllServlet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}

addBrand.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>添加品牌</title>
</head><body><h3>添加品牌</h3><form action="/web_demo4_brandDemo_war/addServlet" method="post">品牌名称:<input name="brandName" value="淘宝"><br>企业名称:<input name="companyName" value="阿里巴巴"><br>排序状况:<input name="ordered" value="10"><br>描述信息:<textarea rows="5" cols="20" name="description">阿里巴巴</textarea><br>状态信息:<input type="radio" name="status" value="0" checked>禁用<input type="radio" name="status" value="1">启用<br><input type="submit" value="提交"></form>
</body></html>
@WebServlet("/addServlet")
public class AddServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("[DEBUG]用户添加数据...");req.setCharacterEncoding("UTF-8");new BrandService().add(new Brand(null,req.getParameter("brandName"),req.getParameter("brandName"),Integer.parseInt(req.getParameter("ordered")),req.getParameter("description"),Integer.parseInt(req.getParameter("status"))));resp.sendRedirect("/web_demo4_brandDemo_war/selectAllServlet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}

update.jsp

<%@page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isELIgnored="false" %>
<!DOCTYPEhtml>
<html lang="en"><head><meta charset="UTF-8"><title>修改品牌</title>
</head><body>
<h3>修改品牌</h3>
<form action="/web_demo4_brandDemo_war/addServlet" method="post"><%--隐藏id--%><input name="id" value="${brand.id}" type="hidden">品牌名称:<input name="brandName" value="${brand.brandName}"><br>企业名称:<input name="companyName" value="${brand.companyName}"><br>排序状况:<input name="ordered" value="${brand.ordered}"><br>描述信息:<textarea rows="5" cols="20" name="description">${brand.description}</textarea><br>状态信息:<input type="radio" name="status" value="0" <c:if test="${brand.status==0}">checked</c:if>>禁用<input type="radio" name="status" value="1" <c:if test="${brand.status==1}">checked</c:if>>启用<br><input type="submit" value="提交">
</form>
</body></html>
<%@page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isELIgnored="false" %>
<!DOCTYPEhtml>
<html lang="en"><head><meta charset="UTF-8"><title>修改品牌</title>
</head><body>
<h3>修改品牌</h3>
<form action="/web_demo4_brandDemo_war/updateServlet" method="post"><%--隐藏id--%><input name="id" value="${brand.id}" type="hidden">品牌名称:<input name="brandName" value="${brand.brandName}"><br>企业名称:<input name="companyName" value="${brand.companyName}"><br>排序状况:<input name="ordered" value="${brand.ordered}"><br>描述信息:<textarea rows="5" cols="20" name="description">${brand.description}</textarea><br>状态信息:<input type="radio" name="status" value="0" <c:if test="${brand.status==0}">checked</c:if>>禁用<input type="radio" name="status" value="1" <c:if test="${brand.status==1}">checked</c:if>>启用<br><input type="submit" value="提交">
</form>
</body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息抽取技术:电商领域的智能化革命与市场策略优化

一、引言 在当今快速发展的互联网电商领域&#xff0c;信息抽取技术的应用已经成为商家优化供应链、降低成本、提高响应速度的关键手段。随着消费者需求的日益多样化和个性化&#xff0c;电子商务平台需要更高效、智能的数据处理能力来应对市场的挑战。从供应商管理到库存优化…

Image Fusion via Vision-Language Model【文献阅读】

阅读目录 文献阅读AbstractIntroduction3. Method3.1. Problem Overview3.2. Fusion via Vision-Language Model 4. Vision-Language Fusion Datasets5. Experiment5.1Infrared and Visible Image Fusion 6. Conclusion个人总结 文献阅读 原文下载&#xff1a;https://arxiv.or…

HTML入门:简单了解 HTML 和浏览器

你好&#xff0c;我是云桃桃。今天来简单了解一下 HTML 以及浏览器。 HTML 是什么&#xff1f; HTML&#xff08;全称&#xff1a;Hypertext Markup Language&#xff09;是一种标记语言&#xff0c;用于创建和呈现网页的结构和内容。 它由一系列标签&#xff08;或称为元素…

android开发视频教程百度网盘,深入浅出Android

基于Linux的pc启动过程 我们都知道&#xff0c;所有的程序软件包括操作系统都是运行在内存中的&#xff0c;然而我们的操作系统一般是存放在硬盘上的&#xff0c;当我们按下开机键的时候&#xff0c;此时内存中什么程序也没有&#xff0c;因此需要借助某种方式&#xff0c;将操…

圆形动画 小球在轨道上循环运动 点击按钮停止开始 在次点击 动画开始

圆形动画 小球在轨道上循环运动 点击按钮停止开始 在次点击 动画开始

Vue-04

Vue 指令 指令补充 指令修饰符&#xff1a;通过"."指明一些指令后缀&#xff0c;不同后缀封装了不同的处理操作 → 简化代码 按键修饰符 keyup.enter → 键盘回车监听 在input中使用keyup.enter&#xff0c;这个时候按enter键也能实现添加&#xff0c;和点击按钮实…

目前最新的集运行业发展及运营模式介绍

集运系统紧跟时代发展潮流&#xff0c;提供“集运系统代购商城”&#xff0c;通过系统掌握C端用户数据&#xff0c;发展代购、电商业务。 跨境电商物流市场蓬勃发展&#xff0c;拥有十万亿量级的增长空间&#xff0c;跨境电商市场规模及进出口总额都呈上升趋势&#xff0c;而未…

CAN总线的拓扑类型和CAN收发器(原理讲解)

1&#xff1a;CAN收发器&#xff08;原理讲解&#xff09; 从原理上来讲CAN_H拉升电压&#xff0c;或CAN_L拉低电压的原理。 以上是TJA1145AT的俯瞰图&#xff0c;此芯片是NXP比较先进的CAN收发器&#xff0c;带SPI总线系统。 回到正题&#xff0c;CAN_H和CAN_L收发器是通过内…

c++|内存管理

c|内存管理 C/C内存分布strlen 和 sizeof的区别 c语言动态内存管理方式malloccallocrealloc例题 c管理方式new/delete操作内置类型new/delete操作自定义类型证明 new 和 delete 的底层原理operator new与operator delete函数operator new 和 operator delete的 用法构造函数里面…

【unity实战】3D水系统,游泳,潜水,钓鱼功能实现

文章目录 素材将项目升级为URP画一个水潭地形材质升级为URP创建水调节水第一人称人物移动控制游泳水面停留添加水下后处理水下呼吸钓鱼参考完结 素材 https://assetstore.unity.com/packages/vfx/shaders/urp-stylized-water-shader-proto-series-187485 将项目升级为URP 这…

使用KVM服务创建虚拟机(简化版)

1. 规划节点 KVM服务虚拟机节点规划&#xff0c;见表。 IP主机名节点192.168.100.10localhostKVM 2. 基础准备 使用VMWare Workstation软件安装CentOS 7.2操作系统&#xff0c;镜像使用提供的 CentOS-7-x86_64-DVD-1511.iso&#xff0c;关闭防火墙并且配置SELinux规则&…

八年老程序员的一二月总结:回家过年、阅读挑战、线下新体验

大家好&#xff0c;我是拭心&#xff0c;一名工作八年的程序员。 每两个月我会做一次总结&#xff0c;为的是留一些回忆、评估自己的行为、沉淀有价值的信息。 回顾一二月&#xff0c;原来发生了这么多事&#xff0c;趁着周末记录一下吧。 有意义的事 1.回家过年 今年回内…

【STM32详解FLASH闪存编程原理与步骤】

STM32详解FLASH闪存编程原理与步骤 FLASH编程注意事项FLASH编程过程STM32的FLASH擦除过程FLASH全片擦除FLASH操作总结锁定解锁函数写操作函数擦除函数获取状态函数等待操作完成函数读FLASH特定地址数据函数 FLASH编程注意事项 1.STM32复位后&#xff0c;FPEC模块是被保护的&am…

基于单片机的数字温度计设计

目 录 摘 要 I Abstract II 引 言 1 1 整体方案设计 3 1.1 主控芯片类型选择 3 1.2 测温电路选择 3 1.3 系统总体方案 4 2 系统的硬件电路设计 5 2.1 单片机系统设计 5 2.2 显示模块设计 8 2.3 温度读取电路的设计 10 3 系统软件设计 13 3.1 软件开发环境的介绍 13 3.2 系统重…

MySQL基础-----SQL语句之DDL数据定义语句

目录 前言 开启登录数据库 一、数据库操作 1.查询所有数据库 2.切换使用数据库 3.查询当前使用的数据库 4.创建数据库 创建一个hello数据库, 使用数据库默认的字符集。 创建一个itheima数据库&#xff0c;并且指定字符集 5.删除数据库 二、表操作 1.查询当前数据库所有…

2024Android高级面试题,这些细节在Android面试上要注意了

前言 对于字节跳动的二面三面而言&#xff0c;FrameworkMVP架构HashMap原理性能优化Flutter源码分析等问题都成高频问点&#xff01;然而很多的朋友在面试时却答不上或者答不全&#xff01;今天在这分享下这些问点的视频解析给大家&#xff0c;希望对有需要的朋友有所帮助&…

【洛谷 P8720】[蓝桥杯 2020 省 B2] 平面切分 题解(计算几何+集合+向量)

[蓝桥杯 2020 省 B2] 平面切分 题目描述 平面上有 N N N 条直线, 其中第 i i i 条直线是 y A i ⋅ x B i yA_{i} \cdot xB_{i} yAi​⋅xBi​ 。 请计算这些直线将平面分成了几个部分。 输入格式 第一行包含一个整数 N N N。 以下 N \mathrm{N} N 行, 每行包含两个…

基于Google Vertex AI 和 Llama 2进行RLHF训练和评估

Reinforcement Learning from Human Feedback 基于Google Vertex AI 和 Llama 2进行RLHF训练和评估 课程地址&#xff1a;https://www.deeplearning.ai/short-courses/reinforcement-learning-from-human-feedback/ Topic: Get a conceptual understanding of Reinforcemen…

vue3 (四)动态组件Vs异步组件

1.动态组件 点击toggle切换2个组件&#xff0c;配合<keep-alive>使用防止切换后数据丢失 <keep-alive><component :is"currentItem"></component> </keep-alive> 2.异步组件 定义方法&#xff1a;app.component(组件名,Vue.defineAs…

西安雁塔未来人工智能计算中心算力成本分析

先看一例旧闻&#xff1a;西部“最强大脑”落户雁塔——30亿亿次超算能力助力创新之城建设 其中提到一期算力为 300PFLOPS FP16&#xff08;每秒30亿亿次半精度浮点计算&#xff09;&#xff0c;项目总投资约为19亿元。 这个算力是什么概念呢&#xff1f; 我们以深度学习训练中…