1、Servlet

3个文件

E:\web.workspace\mldndemo\WebContent\ch14\regist.html

E:\web.workspace\mldndemo\WebContent\ch14\regist.jsp

E:\web.workspace\mldndemo\WebContent\WEB-INF\classes\org\lxh\ajaxdemo\CheckServlet.class

虽然CheckServlet.class所在的位置不是E:\web.workspace\mldndemo\WebContent\,但是如果你在web.xml中配置为如下:

<servlet>
<servlet-name>checkServlet</servlet-name>
<servlet-class>
org.lxh.ajaxdemo.CheckServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>checkServlet</servlet-name>
<url-pattern>/CheckServlet</url-pattern>
</servlet-mapping>

那么,根据上面的url-pattern的配置,CheckServlet在虚拟目录中就相当于对应这个url:http://127.0.0.1:8080/mldn/CheckServlet,这是因为,我在server.xml中是这样配置的

<Context path="/mldn" docBase="E:\web.workspace\mldndemo\WebContent" reloadable="true">

也就是说使用http://127.0.0.1:8080/mldn/访问到的是E:\web.workspace\mldndemo\WebContent\这个目录

在你在任何页面访问CheckServlet的时候,都要使用相对路径,具体来说,那么,现在我在regist.html中如果要访问CheckServlet,应该怎么做呢?

因为regist.html的虚拟路径为http://127.0.0.1:8080/mldn/ch14/regist.html

所以,在regist.html中如果要访问CheckServlet,就必须使用如下的URL(当然,param可以根据情况省略):

../CheckServlet?param1=...&param2=...

具体代码如下:

regist.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script language="javascript">
var xmlHttp ;
var flag = false ;
function createXMLHttp(){
if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest() ;
} else {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP") ;
}
}
function checkUserid(userid){
createXMLHttp() ;
// 这里的问号[?]就是参数的意思[userid]即参数名
xmlHttp.open("POST","../CheckServlet?userid="+userid) ;
xmlHttp.onreadystatechange = checkUseridCallback ;
xmlHttp.send(null) ;
document.getElementById("msg").innerHTML = "正在验证..." ;
}
function checkUseridCallback(){
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
var text = xmlHttp.responseText ;
if(text == "true"){ // 用户id已经存在了
document.getElementById("msg").innerHTML = "用户ID重复,无法使用!" ;
flag = false ;
} else {
document.getElementById("msg").innerHTML = "此用户ID可以注册!" ;
flag = true ;
}
}
}
}
function checkForm(){
return flag ;
}
</script>
</head>
<body>
<form action="regist.jsp" method="post" onsubmit="return checkForm()">
用户ID:<input type="text" name="userid" onblur="checkUserid(this.value)"><span id="msg"></span><br>
姓&nbsp;&nbsp;名:<input type="text" name="name"><br>
密&nbsp;&nbsp;码:<input type="password" name="password"><br>
<input type="submit" value="注册">
<input type="reset" value="重置">
</form>
</body>
</html>

CheckServlet.java

package org.lxh.ajaxdemo ;
import java.sql.* ;
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ; public class CheckServlet extends HttpServlet{
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
public static final String DBURL = "jdbc:mysql://localhost:3306/mldn" ;
public static final String DBUSER = "root" ;
public static final String DBPASS = "mysqladmin" ;
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
this.doPost(request,response) ;
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
request.setCharacterEncoding("UTF-8") ;
response.setContentType("text/html") ;
Connection conn = null ;
PreparedStatement pstmt = null ;
ResultSet rs = null ;
PrintWriter out = response.getWriter() ;
String userid = request.getParameter("userid") ;
try{
Class.forName(DBDRIVER) ;
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
String sql = "SELECT COUNT(userid) FROM user WHERE userid=?" ;
pstmt = conn.prepareStatement(sql) ;
pstmt.setString(1,userid) ;
rs = pstmt.executeQuery() ;
if(rs.next()){
if(rs.getInt(1)>0){ // 用户ID已经存在了
out.print("true") ;
} else {
out.print("false") ;
}
}
}catch(Exception e){
e.printStackTrace() ;
}finally{
try{
conn.close() ;
}catch(Exception e){}
}
}
}

regist.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
欢迎光临!<c:out value="${param.name }"/>!
</body>
</html>

2、Filter

Filter与Servlet不一样,Servlet一般情况下你会在html或者jsp页面中直接引用,这时上面的配置就是有效的,但是filter,是由web-container调用的,你自己不会在html或者jsp页面中直接调用它,所以filter的配置的url-pattern一般是这样:

<url-pattern>/filterdemo/*</url-pattern>

含义就是,对子目录/filterdemo/下的任意页面的引用,都要使用filter进行过滤,web-container发现你的url为上述配置的pattern的情况下,就会调用你的filter进行处理,具体的调用过程你不用操心。

但是,这个时候,如果你要在filter中跳转到/filterdemo/下的某个页面,比如说login.jsp,应该怎么做呢?

对了,根据我们前面说的,Servlet、Filter这些class本身,我们可以认为是放在%web-root%下的(尽管它们的.class文件是放在%web-root%/WEB-INF/classes/中,但到了web-container中,这些serlvet,filter就好像直接被放在了%web-root%对应的虚拟路径下)

所以我们应该这样做,也就是说,filter在引用别的html、jsp页面的时候,与servlet的情况并无区别:

request.getRequestDispatcher("/filterdemo/login.jsp").forward(request,response) ;

例子如下

/WebContent/WEB-INF/web.xml

/WebContent/filterdemo/login.jsp

/WebContent/filterdemo/welcome.jsp

web.xml

<!-- login filter -->
<filter>
<filter-name>login</filter-name>
<filter-class>org.lxh.filterdemo.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/filterdemo/*</url-pattern>
</filter-mapping>

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login.jsp" method="post">
用户名:<input type="text" name="uname"><br>
密&nbsp;&nbsp;码:<input type="password" name="upass"><br>
<input type="submit" value="登陆">
<input type="reset" value="重置">
</form>
<% // 直接通过一个固定的用户名和密码
String name = request.getParameter("uname") ;
String password = request.getParameter("upass") ;
if(!(name==null || "".equals(name) || password==null || "".equals(password))){
if("lixinghua".equals(name) && "mldn".equals(password)){
// 如果登陆成功,则设置session属性范围。
session.setAttribute("userid",name) ;
response.setHeader("refresh","2;URL=welcome.jsp") ;
%>
<h3>用户登陆成功,两秒后跳转到欢迎页!</h3>
<h3>如果没有跳转,请按<a href="welcome.jsp">这里</a>!</h3>
<%
} else {
%>
<h3>错误的用户名或密码!</h3>
<%
}
}
%>
</body>
</html>

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>欢迎<%=session.getAttribute("userid")%>光临本系统!</h3>
</body>
</html>

LoginFilter.java

package org.lxh.filterdemo ;

import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ; public class LoginFilter implements Filter {
public void init(FilterConfig config)
throws ServletException{
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException,
ServletException{
// session属于http协议的范畴
HttpServletRequest req = (HttpServletRequest) request ;
HttpSession ses = req.getSession() ;
if(ses.getAttribute("userid") != null) {
// 已经登陆过了,则可以访问
chain.doFilter(request,response) ;
} else {
request.getRequestDispatcher("/filterdemo/login.jsp").forward(request,response) ;
}
}
public void destroy(){
}
}

Servlet/Filter发布后与其他页面的相对路径的更多相关文章

  1. angular4.0项目build发布后,刷新页面报错404

    angular4.0项目执行npm run build后,进入页面正常显示. 但是当刷新页面时,报错404,页面未找到. 出现这个问题的原因,应该是找不到路由地址导致的,然后找到了下面的解决方案. 找 ...

  2. webpack学习笔记——打包后直接访问页面,图片路径错误

    我说的这种图片路径错误是这样的,运行webpack-dev-server,一切正常,没有错误.当webpack之后,直接打开index页面,报错,图片找不到,找不到的原因是路径错误. 先看我的项目代码 ...

  3. maven项目发布后访问jsp页面报错

    type Exception report message java.lang.NullPointerException description The server encountered an i ...

  4. IIS6.0发布后对路径“D:\xxx\xxxx\web.config”的访问被拒绝问题的解决方法

    原来我本机发布后还是可以直接通过浏览器访问,这几天不知道怎么就不行,终于在网上找到解决方法 IIS发布后访问xxx/xxx/web.config路径被拒绝的问题截图如下: 解决方法: 1.在本地或服务 ...

  5. vue项目发布后带路径打开页面报404问题

    环境: 后端,python+uwsgi启动 前端:vue  用nginx运行,指定静态目录 问题 :发布后带路径打开页面报404问题,带路径打开即不是打开的主页 解决方案: https://route ...

  6. .NET CORE2.0发布后没有 VIEWS视图页面文件

    以前做的CORE1.0的项目,发布的时候有views文件夹的,升级VS后用CORE2.0做项目,发布后没有views文件夹了,全编译到一个类似于Niunan.ZYYCY.Web.Precompiled ...

  7. servlet/filter/listener/interceptor区别与联系

    转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...

  8. filter应用案例四:页面静态化

    1 说明 你到"当当"搜索Java分类图书时,"当当"会去查询数据库!每天都有很多人去搜索"Java分类"的图书,每次都去访问数据库,这会有 ...

  9. Java-maven异常-cannot be cast to javax.servlet.Filter 报错, 原因servlet-api.jar冲突

    使用maven开发web应用程序, 启动的时候报错: jar not loaded. See Servlet Spec . Offending class: javax/servlet/Servlet ...

随机推荐

  1. 解决document.location.href下载文件时中文乱码

    1:tomcat 安装路径下 找到 conf文件下的server.xml 2:<Connector port="8080" URIEncoding="utf-8&q ...

  2. MySQL优化之——权限管理

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46763767 在mysql数据库中,有mysql_install_db脚本初始化权 ...

  3. exception 值太大

      CreateTime--2018年2月5日09:45:01 Author:Marydon 异常: Cause: java.sql.SQLException: ORA-12899: 列 " ...

  4. 〖Linux〗Ubuntu13.10,配置tftp服务器

    前言,配置了好久没有发现老是出问题tftp: server error: (2) Access violation,一般侦测之后... 1. 安装软件包:apt-getsudo apt-get ins ...

  5. Redis学习(2)-redis安装

    安装redis需要先从官网下载的源码进行编译,编译依赖GCC环境,如果没有GCC环境,需要安装GCC. yum install gcc-c++ 步骤1:上传 将Windows下下载的压缩文件上传Lin ...

  6. 九度OJ 1183 守形数 (模拟)

    题目1183:守形数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2663 解决:1424 题目描写叙述: 守形数是这样一种整数.它的平方的低位部分等于它本身. 比方25的平方是625. ...

  7. PHP生成缩略图、加水印

    <?php class ThumbWaterImages{ /** * 生成缩略图/加水印 * classname ThumbWaterImages * datetime:2015-1-15 * ...

  8. XP和Win 7双系统安装说明和注意事项

    安装前说明: 1.先装XP,再装Windows 7,最好不要反过来,不然XP不会把Windows 7的启动管理器给覆盖掉,会麻烦些.总之遵循“旧版本到新版本”安装原则. 2.如果分区不够大,请用以下软 ...

  9. Spring boot处理OPTIONS请求

    一.现象从fetch说起,用fetch构造一个POST请求. fetch('http://127.0.0.1:8000/api/login', { method: "POST", ...

  10. tomcat在debug模式启动直接提示:弹框无法启动,无报错信息;但直接启动的话,就会有报错信息

    今天运行项目,Debug模式启动Tomcat,直接弹框:无法启动(翻译,因为后来整理,所以都忘记当时的截图) 后来尝试直接start,发现不弹框了,但是console有报出错信息. 类似以下错误 20 ...