css样式失效

css样式失效

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/login.css">
		<script type="text/javascript">
       	 	function data_Judge(){
    			// 获得用户名的值
    			var username = document.getElementById("name").value;
    			if(username == null || username==""){
    				alert("用户名不能为空");
    				return false;
    			}
    			// 获得密码的值
    			var password = document.getElementById("pwd").value;
    			if(password == null || password==""){
    				alert("密码不能为空");
    				return false;
    			}
       	 		//获得验证码的值
       	 		var code = document.getElementById("code").value;
       	 		var length = code.length;
       	 		if(length != "5"){
       	 			alert("验证码格式有误");
       	 			return false;
       	 		}
    			
       	 	}
       	 
       	 //点击更换图片函数
       	 function changeImg(){
 			var codeImg = document.getElementById("codeImg");
 			/* 使用第三方直接获取验证码 */
 			codeImg.src="${pageContext.request.contextPath}/KaptchaServlet?time=" + new Date().getTime();
 		}
        </script>
</head>
<body>
	<div class="login">
		<div class="header">
			<h1>
				<a href="/login.do">登录</a>
				<!-- 如果登入失败 msg就会被赋值并提示错误信息 -->
				<p style="color:red">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${ msg }</p>
			</h1>
			<button></button>
		</div>
		<form action="${pageContext.request.contextPath}/LonginServlet" method="post" onsubmit="return data_Judge()">
			<div class="name">
				<input type="text" id="name" name="username">
				<p></p>
			</div>
			<div class="pwd">
				<input type="password" id="pwd" name="password">
				<p></p>
			</div>
			<div class="code">
				<input type="text" id="code" name="verifyCode" style="width: 150px">
				&nbsp;&nbsp;&nbsp;&nbsp; <img id="codeImg" onclick="changeImg()" src="${pageContext.request.contextPath}/KaptchaServlet" style="width: 150px; height: 42px; vertical-align: middle;">
				<p></p>
			</div>
			<div class="btn-red">
				<input type="submit" value="登录" id="login-btn">
			</div>
		</form>
	</div>
</body>
</html>

http://img1.sycdn.imooc.com//climg/5dee3e410988349b19190739.jpg

老师 刚才打开Ec'licpse的是时候打开浏览器输入地址样式就全部失效了  地址好像也没问题


正在回答

登陆购买课程后可参与讨论,去登陆

11回答

同学你好,1、< url-pattern >/* < url-pattern > 中/* 能匹配所有请求URL,会匹配到servlet(/login)、*.jsp、*.js、*.css和*.html,所以直接设置/*也有可能会拦截到css文件的请求响应。

        2、比如页面中<script src="http://地址:端口/项目名/文件名.js"></script>,这就是一个html请求访问这个js文件的一个请求。

        3、jsp引入css有请求和响应嘛

jsp页面引入一个文件,当项目启动后,在页面中访问时,浏览器会向页面发送请求访问这个css文件,服务器通过请求,将这个css文件的内容响应给浏览器的html页面。这就是引入css内容在浏览器执行的一次过程。

        4、如果要绕开css我应该怎样编写这个<url-pattern>拦截路径

同学可以尝试如下方法过滤对应的页面,比如:

http://img1.sycdn.imooc.com//climg/5def6d450919c84807380402.jpg

修改后重启,再试一下。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • jia_蛙 提问者 #1
    老师麻烦看一下回复
    2019-12-10 18:27:04
提问者 jia_蛙 2019-12-10 21:40:51
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>book_system</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>login.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
   <!-- 配置初始化用户账户参数 -->
  <context-param>
    <param-name>account</param-name>
    <param-value>admin</param-value>
  </context-param>
  <context-param>
    <param-name>password</param-name>
    <param-value>huangzhou</param-value>
  </context-param>
  
  <!-- 对kaptcha第三方验证码生成包进行配置 -->
  <servlet>
    <servlet-name>KaptchaServlet</servlet-name>
    <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
    
    <!--去掉干扰线 -->
    <init-param>
      <param-name>kaptcha.noise.impl</param-name>
      <param-value>com.google.code.kaptcha.impl.NoNoise</param-value>
    </init-param>
    
    <!--更换干扰样式 这里可以使用阴影效果 ShadowGimpy -->
    <init-param>
      <param-name>kaptcha.obscurificator.impl</param-name>
      <param-value>com.google.code.kaptcha.impl.ShadowGimpy</param-value>
    </init-param>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>KaptchaServlet</servlet-name>
    <url-pattern>/KaptchaServlet</url-pattern>
  </servlet-mapping>
 
   <!-- 字符集的过滤器 -->
  <filter>
    <filter-name>CharacterFilter</filter-name>
    <filter-class>com.zhou.web.filter.CharacterEncodingFilter</filter-class>
    <!-- 过来参数化设置 -->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <!-- 设置多个拦截路径  -->
  <filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/page/*</url-pattern>
  </filter-mapping>
 <filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/login.jsp</url-pattern>
  </filter-mapping> 
    <filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/AddCategoryServlet</url-pattern>
  </filter-mapping>
  
  <!--登录过滤器 --> 
  <filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.zhou.web.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/page/*</url-pattern>
  </filter-mapping>
  

</web-app>
老师我刚才直接对添加分类的servlet进行了拦截, 现在有用了,回想起来,一开始,我先是因为
在字符解过滤器中设置了拦截全部,然后是css样式失效,然后接着直接根据老师的指导,直接拦截
对应的sevlet,现在有用了,我想问一下,<url-pattern>/page/*</url-pattern>和
  <url-pattern>/login.jsp</url-pattern> 是拦截对应的页面里面传入的数据是吧! 我在添加
  分类的页面上已经可以拦截到这个页面,案例说传入到添加分类的servlet中的数据已经是utf-8
  的了,为什么我们还需要到添加分类的sevlet进行拦截才能生效?这个我有点不理解


  • 同学你好,1、<url-pattern>/page/*</url-pattern>是拦截所有page文件夹下访问页面的所有请求。<url-pattern>/login.jsp</url-pattern>拦截login.jsp页面的所有请求。所以这两个拦截并没有对所有的Servlet进行过滤。2、如上所示在添加分类的jsp页面中添加了过滤,而AddCategoryServlet是一个Servlet,并没有对它进行过滤,所以字符过滤器并没有对AddCategoryServlet进行过滤。在字符过滤器中添加对AddCategoryServlet的过滤后,就会解决AddCategoryServlet的字符乱码问题。如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-12-11 10:41:41
提问者 jia_蛙 2019-12-10 19:52:21
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>book_system</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
   <!-- 配置初始化用户账户参数 -->
  <context-param>
    <param-name>account</param-name>
    <param-value>admin</param-value>
  </context-param>
  <context-param>
    <param-name>password</param-name>
    <param-value>huangzhou</param-value>
  </context-param>
  
  <!-- 对kaptcha第三方验证码生成包进行配置 -->
  <servlet>
    <servlet-name>KaptchaServlet</servlet-name>
    <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
    
    <!--去掉干扰线 -->
    <init-param>
      <param-name>kaptcha.noise.impl</param-name>
      <param-value>com.google.code.kaptcha.impl.NoNoise</param-value>
    </init-param>
    
    <!--更换干扰样式 这里可以使用阴影效果 ShadowGimpy -->
    <init-param>
      <param-name>kaptcha.obscurificator.impl</param-name>
      <param-value>com.google.code.kaptcha.impl.ShadowGimpy</param-value>
    </init-param>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>KaptchaServlet</servlet-name>
    <url-pattern>/KaptchaServlet</url-pattern>
  </servlet-mapping>
  
  <!--登录过滤器 --> 
  <filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.zhou.web.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/page/*</url-pattern>
  </filter-mapping>
  
  <!-- 字符集的过滤器 -->
  <filter>
    <filter-name>CharacterFilter</filter-name>
    <filter-class>com.zhou.web.filter.CharacterEncodingFilter</filter-class>
    <!-- 过来参数化设置 -->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <!-- 设置多个拦截路径  -->
  <filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/page/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/login.jsp</url-pattern>
  </filter-mapping>
    <filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/page/addCategory.jsp</url-pattern>
  </filter-mapping>
</web-app>
把<url-pattern>改为<url-pattern>/<url-pattern> 是什么意思  ?我跟老师你说的对添加新分类
的servlet的过滤 还是乱码

http://img1.sycdn.imooc.com//climg/5def86f209c19e7913220236.jpg

提问者 jia_蛙 2019-12-10 18:26:44

http://img1.sycdn.imooc.com//climg/5def72220976f31611820587.jpg

http://img1.sycdn.imooc.com//climg/5def726b0914901d00000000.jpg

已经解决css样式失效了,但是发现添加新分类的时候 分类名称还是乱码,我后台测试也能正常
输出字符集,但是就是乱码


  • 同学你好,同学现在的web.xml中是否按照如上举例来修改,如果是,字符过滤器默认没有过滤所有的servlet请求,同学可以修改<url-pattern>中的内容,有如下两种方法尝试:1、将<url-pattern>改为<url-pattern>/</url-pattern>。2、在<url-pattern>中添加对添加新分类的servlet的过滤。如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-12-10 19:31:48
  • 提问者 jia_蛙 回复 好帮手慕小班 #2
    老师 已经回复 麻烦看一下
    2019-12-10 20:11:03
提问者 jia_蛙 2019-12-10 16:09:51
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>s_book_system</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 配置初始化用户账户参数 -->
  <context-param>
    <param-name>account</param-name>
    <param-value>admin</param-value>
  </context-param>
  <context-param>
    <param-name>password</param-name>
    <param-value>huangzhou</param-value>
  </context-param>
  
  <!-- 对kaptcha第三方验证码生成包进行配置 -->
  <servlet>
    <servlet-name>KaptchaServlet</servlet-name>
    <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
    
    <!--去掉干扰线 -->
    <init-param>
      <param-name>kaptcha.noise.impl</param-name>
      <param-value>com.google.code.kaptcha.impl.NoNoise</param-value>
    </init-param>
    
    <!--更换干扰样式 这里可以使用阴影效果 ShadowGimpy -->
    <init-param>
      <param-name>kaptcha.obscurificator.impl</param-name>
      <param-value>com.google.code.kaptcha.impl.ShadowGimpy</param-value>
    </init-param>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>KaptchaServlet</servlet-name>
    <url-pattern>/KaptchaServlet</url-pattern>
  </servlet-mapping>
  
  <!--登录过滤器 -->
  <filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.zhou.web.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/page/*</url-pattern>
  </filter-mapping>
  
  <!-- 字符集的过滤器 -->
  <filter>
    <filter-name>CharacterFilter</filter-name>
    <filter-class>com.zhou.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
package com.zhou.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * CharacterEncodingFilter 字符集过滤器
 * @author 25677
 *
 */
public class CharacterEncodingFilter implements Filter {
	//定义一个类中私有变量用来保存我们从xml中获取的过滤器的值
	private String encoding = "";
		
	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//过滤请求字符集
		//因为我们的操作涉及的是Http操作 所以这里要进行强转操作
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		
		//对拦截到的所有请求进行字符集设置
		req.setCharacterEncoding(encoding);
		//对拦截到的所有响应进行字符集设置
		res.setContentType("text/html;charset=" + encoding);
		
		//最后将请求和 响应继续向后传递
		chain.doFilter(req, res);
		
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		//通过filterConfig对象中的getInitParameter方法得到我们在xml中的初始化参数
		encoding = filterConfig.getInitParameter("encoding");
	
	}

}

http://img1.sycdn.imooc.com//climg/5def51fa09f4788a14560504.jpghttp://img1.sycdn.imooc.com//climg/5def5235098561b818690544.jpg

老师 我找到了css样式失效的关键步骤了,就是web.xml中的字符集配置,我发现我设置字符集配置
之后css样式就会失效,如果屏蔽它,css样式就能够正常的显示图1图2就是分别设置和频闭的样图,
web.xml的代码我贴在上面了,字符过滤器代码也贴在上面了,麻烦老师帮我分析一下


  • 提问者 jia_蛙 #1
    我知道了,我这里设置的字符集过滤器的拦截路径为<url-pattern>/*</url-pattern> /*好像把css样式也拦截了,为什么会拦截到css啊? 是因为页面引入css也算是一个请求嘛还是怎么样?jsp引入css有请求和响应嘛?还有,这里是对请求和响应进行设置字符集,如果要绕开css我应该怎样编写这个<url-pattern>拦截路径呀?
    2019-12-10 17:28:13
提问者 jia_蛙 2019-12-10 12:42:41
  • 同学你好,1、同学重新导入css文件再试试。另外,可以按F12,然后查看对应css样式有没有,浏览器console控制台有没有报错。2、如果只是样式问题,建议同学写为作业提交,然后写出说明文档,将问题说明一下,作业老师会根据同学的作业整体来调整一下。如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-12-10 14:26:50
  • 提问者 jia_蛙 回复 好帮手慕小班 #2
    老师 我找到消失的步骤 麻烦老师看一下上面的回复 谢谢老师
    2019-12-10 16:10:27
好帮手慕小班 2019-12-10 11:53:36

同学你好,1、老师复制同学login.jsp代码是课程正常展示css效果的,同学可以在浏览器中在F12模式下将鼠标放在css样式的链接上,查看对应的具体地址是否正确。

http://img1.sycdn.imooc.com//climg/5def15de090409f308030208.jpg

    2、修改了一下web.xml文件,是否重启了tomcat呐,重启后还是不能正常展示css的样式吗

如果重启还是不能解决,同学直接新建一个项目将现有内容复制过去,因为这可能是eclipse的问题。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 jia_蛙 #1
    老师 我截图了 麻烦您看一下 修改完web.xml文件之后,重启了,已经弄了很久了
    2019-12-10 12:43:39
提问者 jia_蛙 2019-12-10 10:26:22
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/login.css">
		<script type="text/javascript">
       	 	function data_Judge(){
    			// 获得用户名的值
    			var username = document.getElementById("name").value;
    			if(username == null || username==""){
    				alert("用户名不能为空");
    				return false;
    			}
    			// 获得密码的值
    			var password = document.getElementById("pwd").value;
    			if(password == null || password==""){
    				alert("密码不能为空");
    				return false;
    			}
       	 		//获得验证码的值
       	 		var code = document.getElementById("code").value;
       	 		var length = code.length;
       	 		if(length != "5"){
       	 			alert("验证码格式有误");
       	 			return false;
       	 		}
    			
       	 	}
       	 
       	 //点击更换图片函数
       	 function changeImg(){
 			var codeImg = document.getElementById("codeImg");
 			/* 使用第三方直接获取验证码 */
 			codeImg.src="${pageContext.request.contextPath}/KaptchaServlet?time=" + new Date().getTime();
 		}
        </script>
</head>
<body>
	<div class="login">
		<div class="header">
			<h1>
				<a href="/login.do">登录</a>
				<!-- 如果登入失败 msg就会被赋值并提示错误信息 -->
				<p style="color:red">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${ msg }</p>
			</h1>
			<button></button>
		</div>
		<form action="${pageContext.request.contextPath}/LonginServlet" method="post" onsubmit="return data_Judge()">
			<div class="name">
				<input type="text" id="name" name="username">
				<p></p>
			</div>
			<div class="pwd">
				<input type="password" id="pwd" name="password">
				<p></p>
			</div>
			<div class="code">
				<input type="text" id="code" name="verifyCode" style="width: 150px">
				&nbsp;&nbsp;&nbsp;&nbsp; <img id="codeImg" onclick="changeImg()" src="${pageContext.request.contextPath}/KaptchaServlet" style="width: 150px; height: 42px; vertical-align: middle;">
				<p></p>
			</div>
			<div class="btn-red">
				<input type="submit" value="登录" id="login-btn">
			</div>
		</form>
	</div>
</body>
</html>
-------------
老师这上面就是我的全部代码  怕字符超出所以页面直复制了登录的login.jsp  css我都是直接复制
过来的没有该过,我昨天下午发现过滤器和监视器写在同一个包下,然后就创建了一个过滤器,把
这些类分开来,然后修改了一下web.xml文件,后面晚上,我登入的时候,清理了一下浏览器缓存,
就发现没有样式了,不知道是什么原因,找了很久

http://img1.sycdn.imooc.com//climg/5deeff8709e25c1b08260525.jpghttp://img1.sycdn.imooc.com//climg/5deeff6a09226ca000000000.jpg

提问者 jia_蛙 2019-12-10 10:24:01
DeleteCategoryServlet.java
package com.zhou.web.servlet;

import java.io.IOException;
import java.util.List;
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 com.zhou.web.domain.Category;
import com.zhou.web.service.UserService;
import com.zhou.web.service.impl.UserServiceImpl;

/**
 * DeleteCategoryServlet 删除图书分类的控制
 */
@WebServlet("/DeleteCategoryServlet")
public class DeleteCategoryServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收数据
		String categoryId = request.getParameter("categoryId");
		
		//处理数据
		UserService userService = new UserServiceImpl();
		//获取图书分类列表
		List<Category> categoryList = (List<Category>) request.getServletContext().getAttribute("categoryList");
		//删除图书
		userService.DeleteCategory(categoryList,categoryId);
		
		//显示结果
		//重定向到图书分类管理页面
		response.sendRedirect(request.getContextPath() + "/page/categoryList.jsp");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
--------------------
LonginServlet.java
package com.zhou.web.servlet;

import java.io.IOException;
import java.util.List;

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 com.zhou.web.domain.User;
import com.zhou.web.service.UserService;
import com.zhou.web.service.impl.UserServiceImpl;
/**
 * LonginServlet 登入注册的判断的控制器
 */
@WebServlet("/LonginServlet")
public class LonginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收验证码并进行校验
		String verifyCode = request.getParameter("verifyCode");
		//先获取session中保存的验证码的信息
		String code =(String) request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
		
		//equalsIgnoreCase 忽略大小写比较
		if(verifyCode==null || !verifyCode.equalsIgnoreCase(code)) {
			request.setAttribute("msg", "验证码输入不正确!");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
			//response.sendRedirect(request.getContextPath()+"/login.jsp");
			return;//结束下面的代码
		}
		
		//接收用户名与密码并判断
		String username =  request.getParameter("username");
		String password = request.getParameter("password");	
		//封装数据
		User user = new User(username,password);		
		//处理数据
		UserService userService = new UserServiceImpl();
		//.获取全局域ServletContext中用户集合 并调用业务逻辑处理接口中的方法进行判断
		List<User> listUser =(List<User>) request.getServletContext().getAttribute("userList");
		User existUser =  userService.login(listUser, user);
		
		if(existUser == null) {
			request.setAttribute("msg", "用户名或密码错误!");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}else {
			//登录成功 再session设置一个标志表明用户已经登录
			request.getSession().setAttribute("loginName", existUser);
			//重定向到首页
			response.sendRedirect(request.getContextPath()+"/page/categoryList.jsp");
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}


----------------------
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">
	<display-name>book_system</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<!-- 配置管理员账户和密码  -->
	 <context-param>
	   <param-name>account</param-name>
	   <param-value>admin</param-value>
	 </context-param>
	 <context-param>
	   <param-name>password</param-name>
	   <param-value>huangzhou</param-value>
	 </context-param>
	   
	
	<!--配置验证码 -->
	<servlet>
		<servlet-name>KaptchaServlet</servlet-name>
		<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>

		<!--去掉干扰线 -->
		<init-param>
			<param-name>kaptcha.noise.impl</param-name>
			<param-value>com.google.code.kaptcha.impl.NoNoise</param-value>
		</init-param>

		<!--更换干扰样式 这里可以使用阴影效果 ShadowGimpy -->
		<init-param>
			<param-name>kaptcha.obscurificator.impl</param-name>
			<param-value>com.google.code.kaptcha.impl.ShadowGimpy</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>KaptchaServlet</servlet-name>
		<url-pattern>/KaptchaServlet</url-pattern>
	</servlet-mapping>
	  
	<!-- 登录过滤器配置 -->
	<filter>
		<filter-name>LoginFilter</filter-name>
		<filter-class>com.zhou.web.filter.LoginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>LoginFilter</filter-name>
		<url-pattern>/page/*</url-pattern>
	</filter-mapping> 
	  
	  
	<!-- 字符集过滤器 -->
	<filter>
		<filter-name>CharacterFilter</filter-name>
		<filter-class>com.zhou.web.filter.CharacterEncodingFilter</filter-class>
		<!-- 过滤参数化设置 -->
	  	<init-param>
				<param-name>encoding</param-name>
				<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
	  	<filter-name>CharacterFilter</filter-name>
	  	<url-pattern>/*</url-pattern>
	  </filter-mapping>
</web-app>



提问者 jia_蛙 2019-12-10 10:22:42


CharacterEncodingFilter.java

package com.zhou.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * CharacterEncodingFilter 字符集过滤器
 * @author 25677
 *
 */
public class CharacterEncodingFilter implements Filter {
	//定义一个类中私有变量用来保存我们从xml中获取的过滤器的值
	private String encoding = "";	
	@Override
	public void destroy() {
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//过滤请求字符集
		//因为我们的操作涉及的是Http操作 所以这里要进行强转操作
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		
		//对拦截到的所有请求进行字符集设置
		req.setCharacterEncoding(encoding);
		//对拦截到的所有响应进行字符集设置
		res.setContentType("text/html;charset=" + encoding);
		
		//最后将请求和 响应继续向后传递
		chain.doFilter(req, res);		
	}
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		//通过filterConfig对象中的getInitParameter方法得到我们在xml中的初始化参数
		encoding = filterConfig.getInitParameter("encoding");
	}
}
LoginFilter.java

package com.zhou.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zhou.web.domain.User;
/**
 * LoginListener 登录过滤器
 * @author 25677
 *
 */
public class LoginFilter implements Filter {
	@Override
	public void destroy() {
	}
	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		//首先将ServletRequest、ServletResponse进行强转
		HttpServletRequest request = (HttpServletRequest)arg0;
		HttpServletResponse response = (HttpServletResponse)arg1;
		
		//判断session域中的有没有存在用户名,没有则需要重新登录 有则表示登入
		User user  = (User) request.getSession().getAttribute("loginName");
																	
		if(user == null) {
			response.sendRedirect(request.getContextPath() + "/login.jsp");
		}else {
			arg2.doFilter(request, response);
		}		
	}
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}
}
InitServletContextListener.java

package com.zhou.web.listener;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import com.zhou.web.domain.Category;
import com.zhou.web.domain.User;
/**
 * InitServletContextListener 启动程序时,初始化数据
 * @author 25677
 *
 */
//使用注解的方式对监听器进行配置
@WebListener
public class InitServletContextListener implements ServletContextListener {
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
	}
	@Override
	public void contextInitialized(ServletContextEvent event) {	
		//1.初始化账户列表参数
		//创建一个list集合用来保存用户
		List<User> userList = new ArrayList<User>();	
		/*
		 * 假设管理员账号比较隐私 不允许别人创建等操作 我们现在web.xml中配置好管理员账号
		 * 然后再程序初始化的时候获取到保存到list集合中,根据用户登录时输入的数据进行比较
		 */
		String account  =  event.getServletContext().getInitParameter("account");
		String password  =  event.getServletContext().getInitParameter("password");
		
		//创建User对象 并将获得的管理员输入填入其中
		User user = new User(account,password);
		
		//将user对象填入userlist中
		userList.add(user);
		
		//将userList存入ServletContext全局对象中
		event.getServletContext().setAttribute("userList", userList);
			
		//2.初始化图书分类列表参数
		//创建默认分类数据
		Category category = new Category("ca0001","计算机类");
		//创建集合
		List<Category> categoryList = new ArrayList<Category>();
		//往集合中添加数据分类
		categoryList.add(category);
		//将集合对象categoryList存入ServletContext全局对象中
		event.getServletContext().setAttribute("categoryList", categoryList);		
	}
}
UserService.java
package com.zhou.web.service;

import java.util.List;
import com.zhou.web.domain.Category;
import com.zhou.web.domain.User;
/**
 * UserService 处理业务逻辑的接口类
 * @author 25677
 *
 */
public interface UserService {
	
	//处理登录的业务逻辑接口
	public User login(List<User> listUser, User user);

	//处理添加分类逻辑的业务接口
	public boolean JudgeCategory(List<Category> categoryList, Category category);

	//处理删除分类逻辑的业务接口
	public void DeleteCategory(List<Category> categoryList, String categoryId);
}
UserServiceImpl.java

package com.zhou.web.service.impl;
import java.util.Iterator;
import java.util.List;
import com.zhou.web.domain.Category;
import com.zhou.web.domain.User;
import com.zhou.web.service.UserService;

/**
 * UserServiceImpl 处理业务逻辑接口的实现类
 * @author 25677
 *
 */
public class UserServiceImpl implements UserService {
	
	/**
	 * 登入业务逻辑
	 */
	@Override
	public User login(List<User> listUser, User user) {
		for(User users: listUser) {
			if(users.getUser().equals(user.getUser()) && users.getPassword().equals(user.getPassword())) {
				return users;
			}
		}
		return null;
	}
	
	/**
	 * 处理添加分类的业务逻辑  
	 * true 表示添加成功 
	 */
	@Override
	public boolean JudgeCategory(List<Category> categoryList, Category category) {
		
		//如果分类名或者分类id存在一样相同我们都认为添加失败
		for(Category c: categoryList) {
			if(c.getId().equals(category.getId()) || c.getCategoryName().equals(category.getCategoryName())) {
				return false;
			}
		}
		//不存在相同的 则将新的分类添加到集合
		categoryList.add(category);
		
		return true;
	}
	
	/**
	 * 处理删除图书分类的业务逻辑
	 */
	@Override
	public void DeleteCategory(List<Category> categoryList, String categoryId) {
		/*
		 * for(Category category: categoryList) {
		 * if(category.getId().equals(categoryId)) { categoryList.remove(category); } }
		 */
		Iterator<Category> iterator = categoryList.iterator();
		while(iterator.hasNext()) {
			Category c = iterator.next();
			if(c.getId().equals(categoryId)) {
				iterator.remove();
				return;
			}
		}
	}

}
AddCategoryServlet.java
package com.zhou.web.servlet;

import java.io.IOException;
import java.util.List;

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 com.zhou.web.domain.Category;
import com.zhou.web.service.UserService;
import com.zhou.web.service.impl.UserServiceImpl;

/**
 * AddCategoryServlet 添加分类的控制器
 */
@WebServlet("/AddCategoryServlet")
public class AddCategoryServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收数据
		String categoryId = request.getParameter("categoryId");//图书分类ID
		String categoryName = request.getParameter("categoryName");//分类名称
		
		//封装数据 
		Category category = new Category(categoryId,categoryName);
		
		//处理结果
		UserService userService = new UserServiceImpl();
		//获取当前图书分类集合categoryList
		List<Category> categoryList =(List<Category>) request.getServletContext().getAttribute("categoryList");
		//调用方法判断是否已经有相同的分类或者分类名称
		boolean flagAdd = userService.JudgeCategory(categoryList,category);
		
		//显示数据
		if(flagAdd) {
			//添加成功 重定向到图书分类管理页面
			response.sendRedirect(request.getContextPath() + "/page/categoryList.jsp");
		}else {
			//添加失败
			//设置失败标识
			request.setAttribute("flag", "0");
			System.out.println("失败 重复");
			request.getRequestDispatcher("/page/addCategory.jsp").forward(request, response);
			//response.sendRedirect(request.getContextPath() + "/page/addCategory.jsp");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}


提问者 jia_蛙 2019-12-09 23:12:37

http://img1.sycdn.imooc.com//climg/5dee64310994cd1f18960708.jpg

我又随便创建了一个web工程,然后将jsp和css引入有效果,但是在之前工程却没效果


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师