栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java web期末

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力
一,简答题 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)动作用于在页面被请求时引入一个文件
	2)动作用于把请求转发到另一个页面
	3)动作用于查找或实例化一个JavaBean
	4)动作用于设置JavaBean的属性
	5)动作用于输出某个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服务器而言,生成的字节码文件默认存放在“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核心标签库中常见的标签
	通用标签: 
	条件标签: 
	迭代标签: 
	URL标签: 
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"%>
		
		
		
		
		Insert title here
		
		
			


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; } 注册页面: 前端: Insert title here
姓名
密码
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"%> Insert title here

用户管理界面

idnamepwdemail
${x.id }${x.name }${x.pwd }${x.email }
当前${AllUsers.currentPage}/${AllUsers.totalPage}页 首页 上一页 下一页 尾页
--------------------------------------------------------------------------------------------------- pageBean: public class PageBean { private List 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 getPageData() { return pageData; } public void setPageData(List 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 queryAll2(String currentPage) { PageBean 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 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 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"%> Insert title here
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"%> Insert title here



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/821486.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号