Java 最常见的 208 道面试题:第六模块答案 -JavaWeb

本文围绕Web开发知识展开问答,涵盖JSP与Servlet的区别、JSP内置对象及作用域、Session与Cookie机制、SpringMVC和Struts区别等内容,还介绍了避免SQL注入、XSS攻击、CSRF攻击的方法。

64.jsp和servlet有什么区别
答案:jsp经过编译后就变成了servlet,jsp的本质就是servlet,jvm只能识别java的类,不能识别jsp代码web容器将jsp的代码编译成jvm能识别的jav类.
jsp更擅长表现于页面显示,servlet更擅长于逻辑空值
servlet中没有内置对象,jsp中内置对象都通过httpservletrequest 和httpservletresponse 和httpservlet得到

65.jsp内置对象有那些
答案:9个内置对象
request,封装客户端请求,其中包含来自get或post的请求参数
response,封装服务器对客户端的响应
pageContext,通过该对象可以获取其他对象
session,封装用户会话的对象
application,封装服务器运行环境的对象
out,输出服务器响应的输出流对象
config,web应用的配置对象
page,jsp界面本身
exception,封装界面跑出的异常

66.jsp的4中作用域
答案:jsp中的四中作用域包括
page,代表一个页面相关的对象和属性
request,代表web客户机发出的一个请求相关的对象和属性,一个请求可能跨越多个界面涉及多个web组件,需要在界面显示的临时数据可以放在此作用域
session,代表用户和服务器建立的一次会话和相关的对象属性.
application,代表整个web应用

67.session和cookie
答案:    由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。所以,总结一下:Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

68.说一下session的工作原理.
答案:session是一个存在服务器上的类似于一个散列表格的文件,里面存有我们需要的讯息,在我们需要用的时候可以从文件里面取出来,类似于一个大号的map吧,里面的键存储的是用户的sessionid 用户向服务器发送请求的时候会带上这个sessionid这时后就可以从中取出对应的值了

69.如果客户端禁止cookie那么session还能用吗
答案:cookie与session一般认为是两个独立的东西,Session采用的的是在服务器段保持状态的方案,而cookie是采用的在客户端保存,为什么禁用cookie就不能得到session了呢,因为session是用sessionid来确定当前会话所对应的服务器session,而session是用过cookie来传递的,禁用cookie相当于失去了sessionid也就得不到session了

70.springmvc和strues的区别
答案:拦截机制的不同Struts2是类级别的拦截,Stringmvc是方法级的拦截
Struts2是intercept拦截机制,Spring是aop拦截机制,所以struts2配置文件大

71.如何避免被sql注入
答案:preparedstatement,mybatis 的sql中使用 #{}
使用正则表达过滤参数
页面中判断传参

72.什么是xss攻击,如何避免
答案:xss又称css跨站脚本攻击,其原理是攻击者向有xss漏洞的网站中输入而已的hml代码,党用户浏览该网站是,这段hml代码会自动执行,从而达到攻击的目的
防范的思路是对输入和url的参数进行过滤对输出进行编码

73.什么是csrf攻击,如何避免
答案:csef叫跨站请求伪造,一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过得网站发送过去,是目标网站接受并误以为是用户真是操作而去执行命令,常用语盗取账号,转账,发送虚假消息,攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器

<think>我们正在为用户设计一个从零开始学习Java的路径,目标是快速就业。根据用户提供的引用,特别是引用[1]中提到的学习路线,我们将构建一个结构化的学习计划。同时,引用[2]和[3]提供了Java基础部分的一些细节,如JDK/JRE的区别和变量的使用,这些将作为基础部分的内容。 学习计划将分为几个阶段,每个阶段包括目标、关键知识点、学习建议和资源推荐(由于引用中未提供具体资源链接,我们将按知识点推荐资源类型)。计划按照从基础到高级的顺序排列,并给出大致的时间规划(总周期约六个月)。 注意:引用[3]中详细描述了变量的基础,包括声明、赋值、作用域等,这些是Java基础中的核心内容,我们将放在第一阶段。 阶段划分: 1. Java基础(约1个月) 2. 面向对象编程(约1个月) 3. Java高级特性(约半个月) 4. 数据库与JDBC(约半个月) 5. 前端基础(HTML/CSS/JS,约半个月) 6. Java Web技术(约1个月) 7. 主流框架(约1个月) 8. 项目实战与就业准备(约1个月) 下面详细展开每个阶段: ### 第一阶段:Java基础(4周) **目标**:掌握Java基本语法、数据类型、流程控制、数组、方法和基础类库使用。 **关键知识点**: - JDK安装与环境配置(理解JDK和JRE的区别[^2]) - 基本语法:变量(声明、赋值、作用域[^3])、常量、数据类型、运算符 - 流程控制:条件语句(if, switch)、循环(for, while, do-while) - 数组:一维数组、二维数组、数组操作 - 方法:定义、调用、重载、递归 - 字符串:String类和StringBuilder类的使用 - 基础类库:集合框架(List, Set, Map)、异常处理、IO流 - 多线程基础 **学习建议**: - 每天保证4-5小时的有效学习时间,每周完成一个综合练习(如小计算器、学生成绩管理系统等) - 重点理解变量作用域和数据类型转换,避免常见错误(如空指针异常) - 资源推荐:廖雪峰的Java教程、菜鸟教程Java版 ### 第二阶段:面向对象编程(4周) **目标**:掌握面向对象的三大特性(封装、继承、多态)和设计原则。 **关键知识点**: - 类与对象:定义、实例化、构造方法 - 封装:访问修饰符(private, protected, public)、getter/setter - 继承:extends关键字、方法重写、super关键字 - 多态:向上转型、向下转型、接口与抽象类 - 设计原则:单一职责、开闭原则等 - 常用设计模式:单例模式、工厂模式 **学习建议**: - 通过实现实际对象(如动物类、员工类)加深理解 - 完成综合练习:图书管理系统、简易银行系统 - 资源推荐:《Java核心技术 卷I》 ### 第三阶段:Java高级特性(2周) **目标**:掌握泛型、集合框架深入、反射、注解、Lambda表达式等。 **关键知识点**: - 泛型:泛型类、泛型方法、类型擦除 - 集合框架:ArrayList、LinkedList、HashMap底层原理 - 反射机制:Class类、动态加载类 - 注解:自定义注解、元注解 - Lambda表达式与函数式编程 - 流式操作(Stream API) **学习建议**: - 结合集合框架源码学习,理解数据结构和算法应用 - 资源推荐:Java官方文档、B站优质教学视频 ### 第四阶段:数据库与JDBC(2周) **目标**:掌握SQL语法和JDBC操作数据库。 **关键知识点**: - MySQL安装与基本命令 - SQL语句:DDL、DML、DQL(重点) - 数据库设计:三范式、索引、事务 - JDBC:Connection、Statement、PreparedStatement、ResultSet - 数据库连接池(如Druid) **学习建议**: - 完成至少一个数据库设计案例(如电商用户表) - 使用JDBC实现CRUD操作 - 资源推荐:W3Schools SQL教程、菜鸟教程SQL ### 第五阶段:前端基础(2周) **目标**:掌握HTML/CSS/JavaScript基础,能制作静态页面。 **关键知识点**: - HTML5标签 - CSS选择器、盒模型、Flex布局 - JavaScript基础语法、DOM操作、事件处理 - Ajax与JSON **学习建议**: - 制作个人简历页面 - 使用Ajax模拟用户登录 - 资源推荐:MDN Web文档 ### 第六阶段:Java Web技术(4周) **目标**:掌握Servlet、JSP、MVC模式和常用Web组件。 **关键知识点**: - Tomcat服务器配置 - Servlet生命周期、请求响应处理 - JSP基础、EL表达式、JSTL标签 - MVC设计模式 - Cookie与Session - 过滤器(Filter)和监听器(Listener) **学习建议**: - 实现用户登录注册功能(含验证码) - 资源推荐:尚硅谷JavaWeb教程 ### 第七阶段:主流框架(4周) **目标**:掌握Spring、Spring MVC、MyBatis框架及整合。 **关键知识点**: - Spring:IoC容器、AOP、事务管理 - Spring MVC:控制器、视图解析器、拦截器 - MyBatis:映射文件、动态SQL - SSM整合 - Spring Boot:自动配置、起步依赖 **学习建议**: - 使用SSM框架重写之前的项目 - 使用Spring Boot快速搭建项目 - 资源推荐:Spring官方文档、MyBatis官方文档 ### 第八阶段:项目实战与就业准备(4周) **目标**:完成至少两个完整项目,准备简历和面试。 **关键知识点**: - 项目选题:电商系统、在线教育平台 - 技术整合:Redis缓存、消息队列 - 部署上线:Linux基础、Docker容器化 - 简历制作与面试技巧 **学习建议**: - 在GitHub上托管代码,积累项目经验 - 刷LeetCode算法题(重点:数组、字符串、链表) - 资源推荐:牛客网面试题--- ### 学习路径总览 | 阶段 | 内容 | 时间 | 关键产出 | |------|------|------|---------| | 1 | Java基础 | 4周 | 掌握基础语法,完成小项目 | | 2 | 面向对象 | 4周 | 理解OOP,实现管理系统 | | 3 | 高级特性 | 2周 | 掌握集合、泛型、Lambda | | 4 | 数据库 | 2周 | 设计数据库,实现JDBC操作 | | 5 | 前端基础 | 2周 | 静态页面,Ajax交互 | | 6 | Java Web | 4周 | 实现Web应用,理解MVC | | 7 | 主流框架 | 4周 | SSM整合项目 | | 8 | 项目实战 | 4周 | 完整项目上线,简历准备 | > 学习效率公式: > $$ \text{掌握程度} = \frac{ \text{编码时间} \times \text{理解深度} }{ \text{知识遗忘率} } $$ > 建议通过**每日编码**和**周项目复盘**降低遗忘率。 §§相关问题§§ 1. 如何在学习Java过程中有效避免知识遗忘? 2. 零基础学习Java应该避免哪些常见误区? 3. 如何选择适合零基础者的Java实战项目?</think>以下是针对零基础学习Java的**结构化学习路径**,按照知识依赖顺序编排,覆盖从基础到就业的核心内容。总周期约6个月,每天建议投入3-4小时高效学习。路径设计基于Java技术栈的底层依赖关系[^1],确保知识体系连贯。 --- ### **Java学习路径规划(6个月版)** #### **阶段1:编程基础(2周)** | 知识点 | 关键内容 | 实践项目 | |--------------------|--------------------------------------------------------------------------|------------------------------| | **开发环境** | JDK安装与配置(理解JDK/JRE区别[^2])、IDE使用(IntelliJ IDEA) | 配置首个Java项目 | | **基础语法** | 变量声明/赋值/作用域[^3]、数据类型、运算符、类型转换 | 简易计算器 | | **流程控制** | `if-else`/`switch`条件语句、`for`/`while`循环 | 成绩等级判断程序 | > 📌 **重点**:变量作用域遵循`{}`块级规则,如: > ```java > public static void main(String[] args) { > int x = 10; // 作用域在main方法内 > { > int y = 20; // 仅在此代码块有效 > } > System.out.println(y); // 编译错误!y未定义 > } > ``` --- #### **阶段2:面向对象编程(4周)** | 知识点 | 关键内容 | 实践项目 | |--------------------|--------------------------------------------------------------------------|------------------------------| | **类与对象** | 类定义、对象实例化、构造方法、`this`关键字 | 学生信息管理系统 | | **封装与继承** | 访问修饰符(`private`/`protected`)、Getter/Setter、`extends`关键字 | 电商商品类继承体系 | | **多态与接口** | 方法重写、抽象类、接口实现、`instanceof` | 动物行为模拟器 | | **异常处理** | `try-catch-finally`、自定义异常类 | 文件读取异常处理 | > 💡 **设计原则**: > 优先使用组合而非继承,接口隔离优于庞大父类 --- #### **阶段3:Java核心API(3周)** | 模块 | 核心API | 应用场景 | |--------------------|--------------------------------------------------------------------------|------------------------------| | **集合框架** | `ArrayList`/`LinkedList`/`HashMap`、迭代器、`Comparable`排序 | 用户数据缓存管理 | | **IO流** | `FileInputStream`/`BufferedReader`、序列化 | 配置文件读写工具 | | **多线程** | `Thread`/`Runnable`、线程同步(`synchronized`)、线程池 | 模拟多用户并发请求 | | **日期时间** | `LocalDate`/`DateTimeFormatter`(Java 8+) | 日程提醒程序 | --- #### **阶段4:数据库与JDBC(2周)** ```mermaid graph LR A[Java程序] --> B[JDBC驱动] B --> C[MySQL数据库] C --> D[SQL语句] D --> E[CRUD操作] ``` - **关键技术**: - SQL语法:`SELECT/INSERT/UPDATE/DELETE` - JDBC核心:`Connection`/`PreparedStatement`/`ResultSet` - 连接池:HikariCP配置与优化 - **项目实战**:银行账户管理系统(含持久化层) --- #### **阶段5:Java Web开发(4周)** | 技术栈 | 学习重点 | 产出物 | |--------------------|-------------------------------------------------------------------------|------------------------------| | **Servlet** | 生命周期、`HttpServletRequest/Response`、会话管理(`Cookie`/`Session`)| 用户登录注册系统 | | **JSP** | EL表达式、JSTL标签库 | 动态商品展示页 | | **MVC框架** | Spring MVC工作原理、`@Controller`注解 | RESTful API设计 | | **前端基础** | HTML/CSS/JavaScript基础 | 后台管理系统前端页面 | --- #### **阶段6:主流框架(5周)** ```java // Spring Boot核心注解示例 @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); // 快速启动 } } @Service public class UserService { @Autowired // 依赖注入 private UserRepository userRepo; } ``` - **必学框架**: 1. **Spring**:IoC容器、AOP、事务管理 2. **Spring Boot**:自动配置、Starter依赖 3. **MyBatis**:Mapper映射、动态SQL 4. **Spring Security**:认证与授权 --- #### **阶段7:项目实战与就业(6周)** | 项目类型 | 技术组合 | 目标 | |--------------------|--------------------------------------------------------------------------|------------------------------| | **电商系统** | Spring Boot + MyBatis + Redis + Vue.js | 实现商品/订单/支付模块 | | **社交平台** | Spring Cloud + MySQL分库分表 + WebSocket | 即时通讯与动态发布功能 | | **DevOps集成** | Docker容器化 + Jenkins持续集成 + Linux部署 | 全链路自动化发布 | > 🔥 **就业冲刺**: > - 刷题:LeetCode算法题(重点:字符串/链表/二叉树) > - 简历:突出2-3个技术栈完整的项目 > - 面试:深入理解JVM内存模型(堆/栈/方法区)[^1] --- ### **学习效率公式** $$ \text{掌握度} = \frac{ \text{编码时长} \times \text{项目复杂度} }{ \text{知识遗忘率} } $$ - **建议配比**: - 50%时间写代码(每日至少200行) - 30%时间读源码(JDK/Spring核心类) - 20%时间设计解决方案(画UML/流程图) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值