Java web期末

一,简答题

1、Servlet的体系结构

	1)Servlet接口,规定了必须由Servlet类实现并且由Servlet引擎识别和管理的方法集
	2)GenericServlet抽象类,提供了除service()方法之外其他有关Servlet生命周期的方法
	3)ServletConfig接口,获取Servlet初始化参数和ServletContext对象
	4)HttpServlet抽象类,在原有Servlet接口上添加了对HTTP协议的处理,比Servlet功能更强大
	5)HttpServletRequest接口,用于封装HTTP请求信息
	6)HttpServletResponse接口,用于封装HTTP响应消息

02、Servlet的生命周期

	1)实例化 
		如果Servlet配置了load-on-startup,则服务器在启动时自动实例化该Servlet,
		如果没有配置,则在服务器启动后,客户首次向Servlet发出请求时,实例化该Servlet。
	2)初始化  
		Servlet实例化后,Servlet容器将调用Servlet的init方法来对Servlet实例进行初始化,
		如果初始化成功,Servlet在Web容器中会处于服务可用状态;
		如果初始化失败,Servlet容器会销毁该实例;
		当Servlet运行出现异常时,Servlet容器会使该实例变为服务不可用状态。
	3)请求处理  
		服务器接收到客户端请求,会为该请求创建“请求”对象和“响应”对象,
		并调用service()方法,service()方法再调用其他方法来处理请求。
		在Servlet生命周期中,service()方法可能被多次调用。
		当多个客户端同时访问某个Servlet的service()方法时,服务器会为每个请求创建一个线程,
		这样可以并行处理多个请求,减少请求处理的等待时间,提高服务器的响应速度。
	4)服务终止  
		当Servlet容器需要终止Servlet,它会先调用Servlet的destroy()方法使其释放正在使用的资源。
		在调用destroy()方法之前,必须让当前正在执行service()方法的任何线程完成执行。
		在destroy()方法完成后,Servlet容器必须释放Servlet实例以便被垃圾回收。

03、转发与重定向的区别

	重定向和请求转发都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有很大的区别:
	1)请求转发只能将请求转发给同一个Web应用中的组件;而重定向不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,或者重定向到其他站点的资源;
	2)请求转发过程结束后,浏览器地址栏保持初始的URL地址不变;重定向结束后,浏览器地址栏的URL会发生改变,由初始的URL地址变成重定向的目标URL; 
	3)请求转发调用者与被调用者共享相同的request、response对象,它们属于同一个访问的请求和响应过程;重定向调用者与被调用者使用各自的request对象和response对象,它们属于两个独立访问的请求和响应过程 

04、include指令与include动作的区别

	1)共同点:include指令元素和include动作元素的作用都是实现包含文件代码的复用。
	2)不同点1:include指令元素是在翻译阶段就引入所包含的文件,被处理的文件在逻辑和语法上依赖于当前JSP页面,优点是页面的执行速度快。
	3)不同点2:include动作元素是在JSP页面运行时才引入包含文件所产生的应答文本,被包含的文件在逻辑和语法上独立于当前JSP页面,优点是可以使用param子元素更加灵活地处理所需要的文件,缺点是执行速度要慢一些。

05、JSP的脚本元素的组成及功能

	1)脚本元素允许用户将小段的代码添加到JSP页面中,包括脚本、表达式、声明和注释
	2)脚本,<% %>,是指JSP中的代码部分,在这个部分中可以使用几乎任何Java的语法
	3)表达式,<%= %>,是做一种简化的输出形式
	4)声明,<%! %>,定义一个或多个变量和方法
	5)注释,<%-- --%>,编译时忽略其内容,在客户端看不到

06、JSP的指令元素的组成及功能

	1)指令用来向容器提供编译信息,并不向客户端产生任何输出,只在当前页面中有效。
	2)page指令一般位于JSP页面的开头部分,用来描述和页面相关的信息
	3)include指令在页面翻译期间引入另一个文件
	4)include指令包含文件时,必须保证新合并生成的文件符合JSP语法规则
	5)taglib指令用于指定JSP页面所使用的标签库,通过该指令可以在JSP页面中使用标签库中的标签

07、JSP的动作元素的组成及功能

	1)<jsp:include>动作用于在页面被请求时引入一个文件
	2)<jsp:forward>动作用于把请求转发到另一个页面
	3)<jsp:useBean>动作用于查找或实例化一个JavaBean
	4)<jsp:setProperty>动作用于设置JavaBean的属性
	5)<jsp:getProperty>动作用于输出某个JavaBean的属性

08、JavaBean的规范

	1)JavaBean是一个公开的(public)类,以便被外部程序访问;
	2)具有一个无参的构造方法,以便被外部程序实例化时调用;
	3)提供setXxx()方法和getXxx()方法,以便让外部程序设置和获取其属性。

09、JSP的page指令中的import、contentType、pageEncoding、errorPage、buffer属性的功能

	1)import:指定导入的Java软件包或类名列表,若有多个类,中间用逗号隔开
	2)contentType:指定MIME类型和JSP页面响应时的编码方式,默认为“text/html;charset=ISO8859-1”
	3)pageEncoding:指定JSP文件本身的编码方式,例如pageEncoding="UTF-8"
	4)errorPage:设定JSP页面发生异常时重新指向的页面URL,指向的页面文件要把isErrorPage设成true
	5)buffer:指定输出流是否需要缓冲,如果设成true则当输出缓冲区满的时候

10、@WebServlet注解常用的属性

	1)name		Servlet的名字,一般与Servlet的类名相同
	2)urlPatterns	指定URL匹配模式,可以是地址映射(/servlet1)、目录映射(/servlet/*)、扩展名映射(*.action)
	3)value		等价于urlPatterns,两个属性不能同时使用
	4)loadOnStartup	指定Servlet的加载顺序 未指定或<0,表示该Servlet第一次被请求时才加载 >=0,表示应用启动时加载该Servlet,值越小,越先加载,原则上不同Servlet值不同
	5)initParams	一组Servlet初始化参数

11、JSP的9大内置对象

	1)request:请求对象,提供客户端HTTP请求数据的访问
	2)response:响应对象,用来向客户端输出响应
	3)out:输出对象,提供对输出流的访问 
	4)session:会话对象,用来保存服务器与每个客户端会话过程中的信息 
	5)application:应用程序对象,用来保存整个应用环境的信息
	6)pageContext:页面上下文对象,用于存储当前JSP页面的相关信息
	7)config:页面配置对象,JSP页面的配置信息对象 
	8)page:当前JSP页面对象,即this 
	9)exception:异常对象,用于处理JSP页面中的错误 

12、JSP的四种作用域及其生命周期

	1)页面域(page scope),存储在页面域的对象只对于它所在页面是可访问的。
	2)请求域(request scope),请求域的生命周期是指一次请求过程,包括请求被转发(forward)或者被包含(include)的情况。存储在请求域中的对象只有在此次请求过程中才可以被访问。  
	3)会话域(session scope),会话域的生命周期是指某个客户端与服务器所连接的时间,存储在会话域中的对象在整个会话期间(可能包含多次请求)都可以被访问。
	4)应用域(application scope),应用域的生命周期是指从服务器开始执行服务到服务器关闭为止,存储在应用域中的对象在整个应用程序运行期间可以被所有JSP和Servlet共享访问。 

13、JSP执行过程

	1)客户向服务器发送JSP页面请求(request);
	2)容器接收到请求后检索对应的JSP页面,如果该JSP页面(或被修改后的JSP页面)是第一次被请求,则容器将此页面中的静态数据(HTML文本)和动态数据(Java脚本)全部转化成Java代码,使JSP文件翻译成一个Java文件,即Servlet;
	3)容器将翻译后的Servlet源代码编译形成字节码文件(.class),对于Tomcat服务器而言,生成的字节码文件默认存放在“<Tomcat安装目录>\work目录下”;
	4)编译后的字节码文件被加载到容器内存中执行,并根据用户的请求生成HTML格式的响应内容;
	5)容器将响应内容即响应(response)发送回客户端。 

14、Session对象的创建与销毁(即何时创建Session对象,何时销毁)

创建:
	1)对Servlet而言,第一次执行request.getSession()时,创建Session 
	2)对JSP而言,默认情况下,客户端第一次访问该JSP时,创建Session 
销毁:
	3)显示调用HttpSession.invalidate()方法 
	4)Session超时  
	5)服务器关闭或服务停止

15、EL的隐含对象

	pageContext:对应于JSP页面中的pageContext对象 
	pageScope:代表page域中用于保存属性的Map对象 
	requestScope:代表request域中用于保存属性的Map对象 
	sessionScope:代表session域中用于保存属性的Map对象 
	param:表示一个保存了所有请求参数的Map对象 
	paramValues:表示一个保存了所有请求参数的Map对象,返回的是一个string[]
	header:表示一个保存了所有http请求头字段的Map对象 
	headerValues:表示一个保存了所有http请求头字段的Map对象,返回string[]数组  
	cookie:表示一个保存了所有cookie的Map对象  
	initParam:表示一个保存了所有web应用初始化参数的map对象 

16、jstl核心标签库中常见的标签

	通用标签:<c:out>、<c:set>、<c:remove>、<c:catch> 
	条件标签:<c:if>、<c:choose>、<c:when>、<c:otherwise> 
	迭代标签:<c:forEach>、<c:forTokens> 
	URL标签:<c:url> 、<c:redirecrt> 

17、过滤器的生命周期

	1)加载和实例化  
	Web容器启动时,会根据@WebFilter属性filterName所定义的类名的大小写拼写顺序,或者web.xml中声明的Filter顺序依次实例化Filter。
	2)初始化 
	Web容器调用init(FilterConfig config)方法来初始化过滤器。容器在调用该方法时,向过滤器传递FilterConfig对象。实例化和初始化的操作只会在容器启动时执行,并且只会执行一次。
	3)doFilter()方法的执行  
	当客户端请求目标资源的时候,容器会筛选出符合过滤器映射条件的Filter,并按照@WebFilter属性filterName所定义的类名的大小写拼写顺序,或者web.xml中声明的filter-mapping的顺序依次调用这些过滤器的doFilter()方法。
	4)销毁  
	Web容器调用destroy()方法指示过滤器的生命周期结束。在这个方法中,可以释放过滤器使用的资源。

18、XMLHttpRequest对象的readyState的五种状态和status的五种状态

readyState的五种状态
	0、初始状态,未调用send()方法   
	1:调用send()方法,开始发送请求
	2:send()完毕,客户端数据发送到服务器,服务器响应,客户端接收服务器的响应内容 
	3:开始解析响应内容  
	4:解析响应内容完毕,客户端可以查看响应结果 
status的五种状态:
	1xx:信息提示  
	2xx:成功,常用200 
	3xx:重定向 
	4xx:客户端错误 
	5xx:服务器错误 

19、Cookie的分类

	1)cookie在浏览器第一次访问服务器时生成,并通过响应带回到浏览器。如果访问servlet时,即没有new Cookie()并添加到响应对象,也没有显式request.getSession()则不生成cookie
	2)根据cookie的setMaxAge(单位为秒,<0、>0、=0)区分为:
		临时cookie,setMaxAge的参数<0或者没有执行setMaxAge,cookie存储在浏览器内存中,浏览器关闭即失效
		永久cookie,setMaxAge的参数>0,cookie以文件形式存储在操作系统中,超过最大值时失效 setMaxAge的参数=0时,删除该cookie
	3)浏览器再次访问服务器的时候,根据cookie的setDomain、setPath、setMaxAge共同确定是否携带该cookie,如果携带该cookie,则取该cookie的name和value,其余的domain、path、maxage都不带(为了减少数据量)
		这也解释了服务器取到cookie以后,所有cookie的name、value有值,其余domain、path为空、maxage为-1
	4)默认情况下,创建Cookie时没有设置路径,该Cookie只能被当前目录及子目录应用访问。

20、当客户端访问服务器页面(html、jsp)时,是否会创建Session对象,为什么

	1)访问html等静态资源,因为不会被编译为Servlet,所以不创建Session对象。
	2)第一次访问jsp时,服务器会自动为其创建一个session,并把其id发送给客户端,以后客户端接收到请求本应用中其他资源的时候,会自动在请求头上添加:
	Cookie:JSESSIONID=客户端第一次拿到的session ID   这样,服务器在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象,提供给请求使用。

二,看编程题

	登录页面:
	前端:
		<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
		<!DOCTYPE html >
		<html>
		<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Insert title here</title>
		</head>
		<body>
			<form action="login" method="post" >
				<input type="text" name="name" value="admin"><br>
				<input type="password" name="pwd" value="123"><br>
				<input type="submit">	
			</form>
		</body>
		</html>
	servlet:
		package com.qst.abc;
		import com.qst.bean.User;
		import com.qst.db.DbUtil;
		@WebServlet("/login")		
		public class MyServlet1 extends HttpServlet {
			protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				String name = request.getParameter("name");		
				String pwd = request.getParameter("pwd");
				try {
					Connection conn = DbUtil.getConn();
					String sql = "select * from user where username=? and pwd=?";
					PreparedStatement pstm = conn.prepareStatement(sql);
					pstm.setObject(1, name);
					pstm.setObject(2, pwd);	
					ResultSet rs = pstm.executeQuery();
					User u = null;
					while(rs.next()) {
						u = new User();
						u.setId(rs.getInt("id"));
						u.setUserno(rs.getString("userno"));
						u.setUsername(rs.getString("username"));
						u.setPwd(rs.getString("pwd"));
					}
					if(u == null) {
						response.getWriter().write("info error");
					}else {
						response.sendRedirect("main.jsp");
					}	
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				} catch (SQLException e) {
					e.printStackTrace();
				}finally{
					DbUtil.close(rs,pstmt,conn);
				}
			}
			protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				doGet(request, response);
			}
		}
	user:
		public class User {
			private int id;
			private String userno;
			private String username;
			private String pwd;
			public int getId() {
				return id;
			}
			public void setId(int id) {
				this.id = id;
			}
			public String getUserno() {
				return userno;
			}
			public void setUserno(String userno) {
				this.userno = userno;
			}
			public String getUsername() {
				return username;
			}
			public void setUsername(String username) {
				this.username = username;
			}
			public String getPwd() {
				return pwd;
			}
			public void setPwd(String pwd) {
				this.pwd = pwd;
			}

	注册页面:
	前端:
		<!DOCTYPE html>
		<html>
		<head>
		<meta charset="UTF-8">
		<title>Insert title here</title>
		</head>
		<body>
		<form action="register" method="post" >
			姓名<input type="text" name="name"><br> 
			密码<input type="password" name="pwd"><br> 
			<input type="submit">
		</form>
		</body>
		</html>
	servlet:
		package com.qst.servlet;

		@WebServlet("/register")
		public class MyReg extends HttpServlet {
			private static final long serialVersionUID = 1L;
			public MyReg() {
				super();
			}
			protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				request.setCharacterEncoding("utf-8");
				response.setCharacterEncoding("utf-8");
				String name = request.getParameter("name");
				String pwd = request.getParameter("pwd");
				User u = new User();
				u.setUsername(name);
				u.setPwd(pwd);
				UserDao ud = new UserDao();
				boolean flag = ud.add(u);
				if(flag) {
					response.getWriter().write("添加成功");
					System.out.println("添加成功");
				}else {
					response.getWriter().write("添加失败");
					System.out.println("添加失败");
				}	
			}
			protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				doGet(request, response);
			}
		}
	user:
		public class User {
			private int id;
			private String username;
			private String pwd;
			public int getId() {
				return id;
			}
			public void setId(int id) {
				this.id = id;
			}
			public String getUsername() {
				return username;
			}
			public void setUsername(String username) {
				this.username = username;
			}
			public String getPwd() {
				return pwd;
			}
			public void setPwd(String pwd) {
				this.pwd = pwd;
			}
		}
	userdao:
		public class UserDao {
			public boolean add(User u) {
				Connection conn = null;
				PreparedStatement pstm = null;
				try {
					conn = DBUtil.getConnection();			
					String sql = " insert into user(username,pwd) values(?,?) ";
					pstm = conn.prepareStatement(sql);			
					pstm.setObject(1, u.getUsername());
					pstm.setObject(2, u.getPwd());			
					return pstm.executeUpdate()>0;
				} catch (SQLException e) {
					e.printStackTrace();
					return false;
				}finally {
					DBUtil.closeJDBC(null, pstm, conn);
				}
			}
			public User queryByNamePwd(String name, String pwd) {
				Connection conn = null;
				PreparedStatement pstm = null;
				ResultSet rs = null;
				try {
					conn = DBUtil.getConnection();			
					String sql = " select * from user where username=? and pwd=? ";
					pstm = conn.prepareStatement(sql);			
					pstm.setObject(1, name);
					pstm.setObject(2, pwd);	
					rs = pstm.executeQuery();
					User u = null;
					while(rs.next()) {
						int id = rs.getInt("id");
						String str1 = rs.getString("username");
						String str2 = rs.getString("pwd");
						u = new User();
						u.setId(id);
						u.setUsername(str1);
						u.setPwd(str2);						
					}			
					return u;
				} catch (SQLException e) {
					e.printStackTrace();
					return null;
				}finally {
					DBUtil.closeJDBC(rs, pstm, conn);
				}
			}
		}

	分页查询:
jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="java.util.List" %>
<%@ page import="com.qst.enity.User" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<h1>用户管理界面</h1>	
	<table border="1px" cellspacing="0" align="center">
		<tr><td>id</td><td>name</td><td>pwd</td><td>email</td></tr>
		<c:forEach items="${AllUsers.pageData}" var="x">
		<tr><td>${x.id }</td><td>${x.name }</td><td>${x.pwd }</td><td>${x.email }</td></tr>
		</c:forEach>
	</table>
	<table  align="center">
		<tr>
			<td>当前${AllUsers.currentPage}/${AllUsers.totalPage}</td>
			<td><a href="UserServlet?currentPage=1">首页</a></td>
			<td><a href="UserServlet?currentPage=${AllUsers.currentPage-1}">上一页</a></td>
			<td><a href="UserServlet?currentPage=${AllUsers.currentPage+1}">下一页</a></td>
			<td><a href="UserServlet?currentPage=${AllUsers.totalPage}">尾页</a></td>
		</tr>
	</table>
</body>
</html>
---------------------------------------------------------------------------------------------------
pageBean:
public class PageBean<T> {
	private List<T> pageData;		//0、查询到的分页结果集
	private int totalCount = 0 ;	//1、总记录数
	private int pageSize = 5;		//2、每页记录数		
	private int totalPage = 1;		//3、总页数
	private int currentPage = 1;	//4、当前页
	private int startNum = 1;		//5、开始行号:(当前页-1)*每页记录数
	public List<T> getPageData() {
		return pageData;
	}
	public void setPageData(List<T> pageData) {
		this.pageData = pageData;
	}
	public int getTotalCount() {
		return totalCount;
	}
	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}	
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getTotalPage() {
		totalPage = totalCount / pageSize;
		if (totalCount == 0 || totalCount%pageSize != 0)  totalPage++;
		return totalPage;
	}	
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	public int getStartNum() {
		return (this.currentPage-1)*this.pageSize;
	}
	public void setStartNum(int startNum) {
		this.startNum = startNum;
	}	
}
----------------------------------------------------------------------------------------------------
dao :
public PageBean<User> queryAll2(String currentPage) {
		PageBean<User> pageBean = new PageBean<>();
		pageBean.setTotalCount(getTotalCount());
		int no;
		try {
			no = Integer.parseInt(currentPage);
			if(no<1)
				no = 1;
			else if(no>pageBean.getTotalPage())
				no = pageBean.getTotalPage();
		}catch (Exception e) {
			no = 1;
		}		
		pageBean.setCurrentPage(no);
		List<User> users = new ArrayList<>();
		try {
			conn = DbUtil.getConn();	
			String sql = " select * from user limit ?,? ";
			pstm = conn.prepareStatement(sql);
			pstm.setObject(1, pageBean.getStartNum());
			pstm.setObject(2, pageBean.getPageSize());
			ResultSet rs = pstm.executeQuery();
			while(rs.next()) {
				User u = new User();
				u.setId(rs.getInt("id"));
				u.setName(rs.getString("name"));
				u.setPwd(rs.getString("pwd"));
				u.setEmail(rs.getString("email"));
				u.setRole(rs.getString("role"));
				users.add(u);
			}			
			pageBean.setPageData(users);
			return pageBean;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			DbUtil.close(rs,pstm,conn);
		}	
	}
servlet:

@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public UserServlet() {
        super();
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String pageNoStr = request.getParameter("currentPage");
		UserDao us = new UserDao();
		PageBean<User> users = us.queryAll2(pageNoStr);
		request.setAttribute("AllUsers", users);
		request.getRequestDispatcher("userManage.jsp").forward(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}





	文件的上传
		前端:
		
			<%@ 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="UploadServlet" enctype="multipart/form-data" method="post" >
			<input type="file" name="f1" >
			<input type="submit">
			</form>
			</body>
			</html>
			
		servlet:
			
			@WebServlet("/UploadServlet")
			@MultipartConfig
			public class UploadServlet extends HttpServlet {
				private static final long serialVersionUID = 1L;
				public UploadServlet() {
					super();
				}
				protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		0、这种写法会把所有上传的文件都存为1.txt,覆盖
					Part p = request.getPart("f1");	
					p.write("c://temp//1.txt");
//					1、request取上传文件信息
					Part p = request.getPart("f1");		
//					2、从part中取文件名
					String header =  p.getHeader("content-disposition");
//					3、不同浏览器的p.getHeader返回格式不同,需重新提取文件名
					String fileName = getFileName(header);	
//					4、取文件的扩展名
					String suffix = fileName.substring(fileName.lastIndexOf("."));
//					5、为防止文件重名导致覆盖,使用时间字符串重新拼接文件名
					String str = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());		
					fileName = fileName.substring(0,fileName.lastIndexOf("."))+"_"+str+suffix;
//					6、把上传文件的内容写入服务器
					p.write("c://temp//"+fileName);		
					response.getWriter().write("upload ok");	
				}
				private String getFileName(String header) 
				{
				// 把form-data; name="myfile"; filename="abc.doc"切成3份
				String[] temp1 = header.split(";");	
				// 把filename="abc.doc"切成2份	
				String[] temp2 = temp1[2].split("=");
				// 从abc.doc或者E:\abc.doc中提取文件名	
				return temp2[1].substring(temp2[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
				}
				protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
					doGet(request, response);
				}
			}

			
	-------------------------------------------------------------------------------------------------------------------------------------------------------------------		
	1、生成验证码的Servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
//		1、定义验证码底图宽高
		int width = 80;
		int height = 30;
		
//		2、创建验证码底图
		BufferedImage image= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		
//		3、取验证码底图的画笔,用来画底图、写验证码
		Graphics g = image.getGraphics();
		
//		4、设置画笔颜色
		g.setColor(Color.BLUE);
		
//		5、画黑色的验证码底图
		g.fillRect(0, 0, width, height);
				
		
//		7、定义验证码集合
		String[] codes = {"0","1","2","3","4","5","6","7","8","9"};
		StringBuilder sb = new StringBuilder();
		Random r = new Random();
		
//		8、修改画笔颜色,准备往底图上写验证码
		g.setColor(Color.WHITE);
		
//		9、随机生成4位验证码,写入底图并存入字符串
		for(int i=0; i<4; i++) {
			int n = r.nextInt(10);
			String code = codes[n];
			
//			10、验证码写入底图
			g.drawString(code, 20*i, 15);
			
//			11、验证码存入字符串
			sb.append(code);
		}
		
//		12、验证码字符串写入session,即存到服务器端,备验证使用
		request.getSession().setAttribute("checkcode", sb.toString());
		
//		13、设置响应内容为图片
		response.setContentType("image/jpeg");	
		
//		14、设置http报头,不允许缓存
		response.setDateHeader("expires", 0);
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		
//		15、验证码写入客户端
		ImageIO.write(image, "jpeg", response.getOutputStream());	 
}

2、登录界面
<%@ 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>
<script type="text/javascript">
  function reCode()
  {
	  document.getElementById("chkcode").src= "ChkcodeServlet?x="+new Date();
  }
</script>
</head>
<body>
  <form action="LoginServlet" method="post">
    <input type="text" name="user" placeholder="用户名"><br>
    <input type="password" name="pwd" placeholder="密码"><br>
    <input type="text" name="chkcode" placeholder="验证码">
    <img id="chkcode" title="点击刷新" onclick="reCode()" src="ChkcodeServlet" ><br>
    <input type="submit">
  </form>
</body>
</html>
  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java大学学期期末大作业合集 内容概览: 这份合集是我在大学期间完成的Java学期期末大作业,其中包括了完整的代码、项目、文档和使用说明。内容涵盖了从基础到进阶的Java知识,具体包括: 代码与项目:详细的Java代码,展示了各种数据结构和算法的实际应用。同时,我还创建了一个完整的小型项目,该项目使用Java进行开发,并实现了多种功能。 MD文档:为了帮助他人更好地理解项目,我编写了详细的Markdown文档,对项目进行了全面的介绍,包括项目背景、功能描述、技术栈选择等。 操作手册与使用说明:针对项目的实际使用,我编写了详尽的操作手册和使用说明,确保用户可以轻松上手。 学习笔记:在完成项目的过程中,我记录了大量的学习笔记,这些笔记涵盖了我遇到的问题、解决方案以及学习心得。 适用人群: 这份合集适用于所有正在学习或已经掌握Java基础的人群,无论你是大学生、Java初学者还是有一定经验的开发者,都可以从中获得启发和帮助。 使用建议: 按需阅读:不同的用户可能有不同的需求,你可以根据自己的实际情况选择阅读的内容。例如,如果你对某个算法或数据结构感兴趣,可以直接查看相关的代码实现。 实践为先:虽然这份合集提供了丰富的理论知识和实践代码,但最好的学习方式仍然是亲自动手实践。尝试运行代码、修改项目并解决遇到的问题。 持续学习:Java是一门不断发展的语言,新的特性和技术不断涌现。我建议你在使用这份合集的同时,也要关注Java的最新动态,持续学习和进步。
1. 总体介绍 本次项目主要以本学期所学内容为基础,采用servlet+jsp+jdbc的技术以及mvc模式进行项目开发,本次开发的内容主要以实现CRUD核心功能为主的教务管理系统,分为学生端和教师端,前端采用jquery进行数据传输以及处理,bootstap写界面。 2. 技术架构 运行环境:tomcat9+mysql5+maven3.8+jdk8 前端技术:jquery 用以数据处理以及前端验证以及生成验证码等等 Bootstrap 前端界面处理 后端技术:servelt+jsp maven进行jar包和第三方库管理 采用jspsmart进行文件的操作处理 数据库:mysql5 基于MVC的分层思想及采用jsp+servelt技术的B/S结构的应用系统,系统主要开发语言为JAVA,JSP。数据库要求使用MySQL8.0,应用服务器选用Tomcat服务器 3. 功能介绍 系统能够提供用户有好的界面 系统具有良好的允许效率 系统具有良好的扩充性,灵活性 系统管理操作简单易懂 3.1 总体结构 3.2 模块详情 学生模块: 注册: 1. 用户点击注册,进行注册; 2. 用户输入注册信息; 3. 校验数据:如果用户名重复或者两次密码校验不合格或者密码规格不符合,则提示错误信息; 4. 若信息无错误,提示注册成功,跳转到登录页。 登录: 1. 用户进入系统未进行登录则自行跳转登录页面; 2. 点击忘记密码可进行密码找回; 3. 提交信息进行校验,查看用户名密码是否为空以及是否符合格式,随后在后台进行校验,合格则进行登录跳转到用户界面; 4. 若登录信息不正确,则提示登录错误信息。 查看成绩: 1. 点击查看成绩,打印成绩列表; 2. 支持到处成绩单为pdf格式。 导出成绩: 1. 点击到处按钮; 2. 系统自动处理并到处成pdf。 个人信息管理: 1. 选择上传头像 2. 修改个人信息:按需填写个人信息,随后进行保存则覆盖修改以往的个人信息。 退出登录: 1. 点击退出登录,自动退出到首页并删除本地和服务器缓存。 教师模块: 注册: 1用户点击注册,进行注册; 2用户输入注册信息; 3校验数据:如果用户名重复或者两次密码校验不合格或者密码规格不符合,则提示错误信息; 4若信息无错误,提示注册成功,跳转到登录页。 登录: 1用户进入系统未进行登录则自行跳转登录页面; 2点击忘记密码可进行密码找回; 3提交信息进行校验,查看用户名密码是否为空以及是否符合格式,随后在后台进行校验,合格则进行登录跳转到用户界面; 4若登录信息不正确,则提示登录错误信息。 个人信息管理: 1选择上传头像 2修改个人信息:按需填写个人信息,随后进行保存则覆盖修改以往的个人信息。 学生管理: 1. 点击添加学生,填写学生信息进行添加; 2. 修改学生信息,点击修改,按需填写要修改的学生信息,进行保存覆盖修改; 3. 点击删除学生数据,提示是否删除,确定则删除,取消则不删除; 4. 查看成绩,点击查看学生成绩,单独列出学生成绩列表; 成绩管理: 1. 点击成绩管理,列出所有学生成绩; 2. 点击修改,勾选需要修改的学生,按需填写修改信息,保存覆盖修改学生信息。 退出登录: 1点击退出登录,自动退出到首页并删除本地和服务器缓存。 4. 页面设计 静态jsp页面和jquery和bootstrap 5. 数据库设计 权限对照表: 表名: role 名称 类型 长度 允许空值 是否主键 注释 uid 整型 11 否 是 权限等级 utype 字符 255 否 否 用户等级名称 分数表: 表名: score 名称 类型 长度 允许空值 是否主键 注释 id 整型 200 否 是 学号 dat 字符 255 否 否 课程1分数 Android 字符 255 否 否 课程2分数 Jsp 字符 255 是 否 课程3分数 学生表: 表名: student 名称 类型 长度 允许空值 是否主键 注释 id 整型 59 否 是 学号 password 字符 255 否 否 登陆密码 Name 字符 255 否 否 学生姓名 Sex 字符 255 是 否 性别 School_date 字符 255 是 否 入学时间 Major 字符 255 是 否 专业 email 字符 255 是 否 邮箱 教师表: 表名: student 名称 类型 长度 允许空值 是否主键 注释 id 整型 59 否 是 教师工号 password 字符 255 否 否 登陆密码 Name 字符 255 否 否 教师姓名 Sex 字符 255 是 否 性别 email 字符 255 是 否 邮箱

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值