这里主要是自己大二的学校课程下的上机任务[下]!
本篇也是比较草草了事, 感谢你的阅读, 看看就好!
补充知识war和exploded的小坑
- war模式:将WEB工程以包的形式上传到服务器 ;对于本地,就是把war包上传到了tomcat的文件目录下面
- war exploded模式:将WEB工程以当前文件夹的位置关系上传到服务器;对于本地,就是把war上传到了idea自己的Tomcat目录下了
实验要求:
<pre>
0 在项目启动和运行时,注意观察生命周期方法的初始化方法的运行结果
0.1 过滤器的初始化
0.2 控制器的初始化
0.3运行过程中的监听器输出
自行完成相应的动作和思考
读完程序中的文档,即注释,如果有相关问题,则直接回答问题。
1 本例中的javabean在哪里完成定义的?在哪里用到了?
1.1这个javabean写得规范吗?
1.2javabean有哪些规范?
1.3请自行将该bean改造成规范的javabean
2 过滤器链如何配置?
3 监听器如何实现相应的监听动作?
4 用户会话如何设置过期时间?
5 服务器上,在控制器,即Servlet中实现包含和转发是如何实现的?客户端知道吗?
6 响应对象如何实现让客户端重定向,再发请求?
7 对于过滤器和控制器的配置,web.xml方式和注解方式,应该如何实现,应该如何选择?
8 检测用户登录的过滤器如何实现用户对目录访问的拦截??
9 本例中,如何检验Servlet的转发和包含动作?
9.1请求/ForwardServlet
9.2请求/IncludeServlet
10 思考,如何去观察监听器的方法动作的完成?自行尝试一下呢?
n 此例有待进一步读解和完善-----
pre>
1 本例中的javabean在哪里完成定义的?在哪里用到了?
1.1这个javabean写得规范吗?不规范!
1.2javabean有哪些规范?没实现 Serializable接口!,没有getter,setter方法,
1.3请自行将该bean改造成规范的javabean
[java bean浅析 | 小小的博客乐园 (ladfeng.top)](https://ladfeng.top/2022/04/01/java bean/)
改造后:
package com.feng.bean;
import java.io.Serializable;
/**
* @author ladidol
* 这是一个javabean,用于数据封装
* 思考下:它的规范是什么?
*/
public class User implements Serializable {
private String name = null;
private String pass = null;
public User(String name,String pass) {
this.name = name;
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", pass='" + pass + '\'' +
'}';
}
/*有了有参构造函数后, 就会把无参给覆盖掉, 所以需要再建一个*/
public User() {
}
}
2 过滤器链如何配置?
<filter>
<filter-name>FilterChina01filter-name>
<filter-class>cn.edu.cuit.filterChain.FilterChain01filter-class>
filter>
<filter-mapping>
<filter-name>FilterChina01filter-name>
<url-pattern>/ServletForFilterChainurl-pattern>
filter-mapping>
<filter>
<filter-name>FilterChina02filter-name>
<filter-class>cn.edu.cuit.filterChain.FilterChain02filter-class>
filter>
<filter-mapping>
<filter-name>FilterChina02filter-name>
<url-pattern>/ServletForFilterChainurl-pattern>
filter-mapping>
不难发现:想要形成过滤链,对多个过滤器都包含的同一个请求,按web.xml中文件的配置顺序执行filter
先访问下:
http://localhost:8080/17/ServletForFilterChain
出现乱码一般解决方案:
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
为了监听器listener能运行起:
web.xml配置一下:
<listener>
<listener-class>com.feng.listener.OnLineCountListenerlistener-class>
listener>
这个项目主要访问一下这个请求:
启动项目直接访问下面url:
http://localhost:8080/17/listener/login.jsp
同时修改提交url为../servlet/LoginAllServlet
登录三个人;
重复登录:
/**
* 控制器核心动作
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 中文乱码处理
request.setCharacterEncoding("utf-8");
// 在项目启动第一次时创建,该项目只创建一次,唯一的,获取上下文对象
context = this.getServletContext();
boolean flag = false; // 用户登录标志
String url="../listener/login.jsp";
// 获取用户参数
String username=request.getParameter("username");
//获取用户列表,第一次获取时候为空,直接从上下文对象中获取
users =(ArrayList<String>)context.getAttribute("users");
//第一个用户登录时,列表肯定为空
if(users.isEmpty()){
users = new ArrayList<String>(); // 初始化列表
users.add(username); // 添加一个用户到列表中
// 以下动作将触发监听动作
context.setAttribute("users", users); // 将第一个用户的名字保存到ServletContext对象中
System.out.println("--------第一个用户登录------");
//非第一个用户登录
}else{
// 遍历,看是否已经存在该用户
for(String user : users){
//如果该用户已经登录,请求error.jsp不让其再登录
if(username.equals(user)){
url = "../listener/error.jsp";
System.out.println("--------该用户重复登录------");
flag = true;
break;
}
}
if (!flag) { // 用户已经存在,标识未登录
//如果该用户没登录,就将该用户的名字保存到ServletContext对象中
System.out.println("--------非重复登录------");
users.add(username);
}
}
// 在控制台输出已经登录的用户
int i = 0;
for (String user : users) {
System.out.println("==========" + i+1+" : " + user +"==========");
i++;
}
// 响应对象完成重定向,这个动作会让客户端再次发请求来完成
response.sendRedirect(url);
}
为了保证将多次登录的user信息保存, 并于下次访问是有用户列表展示, 就必须把用户存在servletcontext上下文中
private ServletContext context =null; // 上下文对象
给每个用户的对话session给设置过期时间:
web中配置的一分钟
<session-config>
<session-timeout>1session-timeout>
session-config>
一分钟后, Session就会销毁:
如果要创建多个Session, 可以多开几个浏览器窗口访问这个登录url
session的创建和销毁
走一下转发:
RequestDispatcher接口所定义的forward()方法可以将HTTP请求转送给其他Web资源(例如Servlet、JSP或HTML)进行处理,并产生HTTP回应。
这里有include和forward的区别:
forward方法是把请求的内容转发到另外的一个servlet/jsp.
include是把另一个servlet/jsp处理过后的内容拿过来与此时servlet的内容一同输出.
(13条消息) 请求转发的forward , include 的区别 _yukunzgp的博客-CSDN博客
转发
<%@include file="需要访问的jsp文件.jsp" %>
<%@forward file="需要访问的jsp文件.jsp" %>
http://localhost:8080/17/myInclude.jsp
http://localhost:8080/17/myForward.jsp
emm不知道为啥这个el的隐藏对象:${sessionScope.Include }
和${sessionScope.Forward }
获取不出来
好兄弟救命!!!
监听器:
package com.feng.listener;
import com.feng.bean.User;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @author fhzheng
* 监听器实现如下监听
* 1.ServletContextListener 上下文变更监听器
* 2.HttpSessionListener 会话变更监听器
* 3.HttpSessionAttributeListener 会话属性变更监听器
* 4.当相应的对象发生变更时,就触发监听事件
*
*/
public class OnLineCountListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {
private ServletContext application = null; // 上下文对象
private ArrayList<String> users = null; // 用户列表
private HttpSession session = null; // 用户会话对象
private String user = null;
/**
* 上下文的初始化
*/
public void contextInitialized(ServletContextEvent sce) {
this.application = sce.getServletContext();
this.application.setAttribute("users", new ArrayList<String>());
// List users = (List) this.application.getAttribute("users");
System.out.println("监听器日志:/t监听器完成上下文对象的获取");
System.out.println("监听器日志:/t监听器完成用户列表的初始化");
}
/**
* 上下文的销毁
*/
public void contextDestroyed(ServletContextEvent sce) {
}
/**
* session的创建
*/
public void sessionCreated(HttpSessionEvent se) {
session.setMaxInactiveInterval(5);
System.out.println("监听器日志:/t一个Session创建了!");
}
/**
* session的销毁
*/
public void sessionDestroyed(HttpSessionEvent se) {
session = se.getSession();
user = (String) session.getAttribute("username");
users = (ArrayList<String>) session.getServletContext().getAttribute("users");
for (String u : users) {
if (u.equals(user)) {
users.remove(u);
break;
}
}
session.invalidate();
System.out.println("监听器日志:/t一个Session被销毁掉了!");
}
/**
* 属性的添加
*/
public void attributeAdded(HttpSessionBindingEvent se) {
users = (ArrayList<String>) application.getAttribute("users");
users.add(se.getValue().toString());
this.application.setAttribute("users", users);
System.out.println("监听器日志:/t一个属性添加完成了");
}
/**
* 属性的移除
*/
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("属性有移除");
}
/**
* 属性的替换【更新】
*/
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("属性有更新");
}
}
emmm就先随便讲到这里吧!
第18个war包:实验要求:
emm大部分是jsp, 看看就行!主要最近没精力再学jsp了, 就可能草率一些了大部分都可以google到的
<pre>
0请问,JSP页中的HTML代码,注释,脚本,表达式,定义分别是什么?它们的标志是什么?
自行完成相应的动作和思考
读完程序中的文档,即注释,如果有相关问题,则直接回答问题。
1 思考,JSP中的中文乱码是如何产生的,应该如何避免这类问题?
2 在JSP页中,如何使用javabean?
3 在JSP页中,如何实现类似于servlet中的转发和包含?forward和include
4 在JSP页中,向用户显示结果时,如何实现换行 *** 作?
5 在JSP页中,pageContext对象有哪些作用域可供 *** 作?
6使用Date对象时,需要注意什么?
pre>
乱码情况:
改一下:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
第19个war包:
实验要求:
优先简单的就回答在里面了
<pre>
自行完成相应的动作和思考
0.读完程序中的文档,即注释,如果有相关问题,则直接回答问题。
1 再次思考,如何组织javabean?
2 一般情况下,javabean有哪些具体的规范?
3 在jsp页中,如何引用bean,如何自动完成bean的属性域的 *** 作?
4 在jsp页中,如何实现对它页的引入 or 嵌入?forward和include
5 访问/register/index.jsp,思考如何把界面上的内容换成自己的内容?
6 JAVA代码和HTML代码混编出来的jsp页面,给你的最深刻的印象是什么?
7 JSP页面如何使用CSS样式?@import "css/all.css";和<link href="login.css" type="text/css" rel="stylesheet" />
8 JSP页面如何使用javascript脚本?然后在**页面**中通过<script>标签的src属性引入
9 请将productManage系统界面修改得一致,界面自主发挥,原则上打上自己的标签
10 在email目录下,邮箱的检测使用的后台javabean功能增强的方式来完成,如何解耦成独立的工具类来检测?
10.1 思考,如何在前台直接用javascript脚本来完成检测?
10.2置于前台检测和置于后台检测,有何差别?,前台可能更快一些?
pre>
js检测邮箱格式
在jsp中使用javabean:
//由下题知道
Bean的使用
编号:
书名:
作者:
用镶嵌的java代码实现
<%
Article article1=new Article();
article1.setId(50);
article1.setTitle("JAVAEE挂科就是拥有不一样的计算机人生经历");
article1.setAuthor("小小小");
%>
编号1:<%=article1.getId() %>
书名1:<%=article1.getTitle() %>
作者1:<%=article1.getAuthor() %>
人有点麻, 我们就简单访问一下吧!
第20个war包:实验要求:
<pre>
自行完成相应的动作和思考
0.读完程序中的文档,即注释,如果有相关问题,则直接回答问题。
1 数据的封装是用什么来实现的
2从控制器过来就有数据,而直接访问employee.jsp就没有数据,为啥?在控制器里面实例化的javabean
3在有数据和没有数据的情况下,el表达式的表现如何?就没有显示
4使用el表达式时,有哪两种方式来获取相应的值?
5在el表达式中的值,是一个对象吗?好像是
6如何直接用el表达式显示浏览器请求的头信息里的键值?
pre>
EL表达式完全攻略 (biancheng.net)
一些el表达式小应用
语言accept-language: ${header['accept-language']}
会话编号session id: ${pageContext.session.id}
雇员信息employee:
${requestScope.employee.name},
${employee.address.country},
${employee.address.state},
${employee.address.city},
首都信息
capital: ${capitals["中国"]},
capital: ${capitals["加拿小"]},
capital: ${capitals["奥地不利"]},
capital: ${capitals["奥小利亚"]},
第21个war包:
自行完成相应的动作和思考
0.读完程序中的文档,即注释,如果有相关问题,则直接回答问题。
1思考,javabean的规范是什么?详情请看之前的博客
2思考,javabean成员的访问 *** 作是如何做到一致性的?
3在jsp页里,如何获取基路径,它是什么?
4在jsp页里,使用绝对路径有什么好处?
5结合之前的servlet里的内容,思考,用servlet来做控制器处理请求和这里直接用jsp页来处理请求,有何异同?
答:emmm不知道, 感觉就是一个向前端一个像后端
6思考jsp页的优势是什么?但不便之处在哪里?主要是简化了servlet, 但是加大了项目的复杂度和耦合度
7页面中的css样式如何 *** 作? 导入就行
8页面中的数据怎么来?前端输入
9页面的渲染【对最终用户呈现完整的面页】包括哪些动作?
10在jsp中,使用javabean时,是如何实现自动装配的?它的先决条件是什么?emm暂时没找到!
1 对base href=“路径”,基路径的理解_lllllzllll的博客-CSDN博客_base href
String path = request.getContextPath();//获取上下文
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
2相对路径和绝对路径的优缺点_tianhandigeng1498的博客-CSDN博客_相对路径和绝对路径的优缺点
3到层用包装类
自动装配:
第22个war包:
实验要求:
笔者没学jsp, 所以大致过一遍:
<pre>
自行完成相应的动作和思考
0.读完程序中的文档,即注释,如果有相关问题,则直接回答问题。
1 本项目,只有jsp页面,主要学习el和jstl
2 请问el是如何判空的
3 那么jstl的引入指令是什么?
4 比较el和jstl标签的差别
5 使用jstl需要额外引入的包是什么?
6 使用jstl可以在界面上实现哪些逻辑,思考,如果是在html中,这些逻辑控制由什么来完成?
7 动态java web project额外导入jar包的方法是什么?在哪里获取这些需要的jar包?
pre>
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:
<%@ taglib prefix="fn"
uri="http://java.sun.com/jsp/jstl/functions" %>
如何给动态 web 工程添加额外 jar 包(详细)
EL.jsp:
比较运算符
4 > 3 ${4 > 3}
4 < 3 ${4 < 3}
4 ≥ 3 ${4 >= 3}
4 ≤ 3 ${4 le 3}
4 = 4 ${4 == 4}
Empty 运算符
empty " " ${empty " "}
empty "" ${empty ""}
empty " sometext " ${empty " sometext "}
jstl01.jsp:
欢迎测试你的第一个使用到JSTL的网页
你使用的浏览器是:
jstlCcatch01.jsp:
在jsp中捕获异常!
<%
String eFormat="not number,不是一个数的格式";
int i=Integer.parseInt(eFormat);
%>
${error_Message}
jstLCout01.jsp:
第23个war包:
自行完成相应的动作和思考
0.读完程序中的文档,即注释,如果有相关问题,则直接回答问题。
1 请问jstl标签是如何引入的?基本的使用步骤是什么?
2 复习,在jsp页中,基路径如何提取?
3 在jstl里的choose...when...otherwise标签一般什么场合下用?
4用户退出,一般如何在技术处理?
5在jstl里,如何迭代处理列表或是数组里的数据?
6在jstl里,forEach签和forTokens签的异同有哪些?
7在jstl里,if签适合什么场合下使用?
8使用import可以包含jsp文件的哪些内容?
9使用jstl里的out签和使用el输出上,有何差别?
10在jsp里如何实现重定向跳转,跳转时如何带上参数?
11在jstl里,如何用choose...when...otherwise实现多路分支选择
12在jstl里,set签设置的值的作用域是如何指定的?
13在jsp页面,如何自己向自己传参?
14请自行整理各页面中的知识点,试着组织成一条线,写好小结
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
emm有点多了, 自行看老师的war包, jsp过时了, 可以随便看看!
第24个war包:实验要求:
<pre>
自行完成相应的动作和思考
0.读完程序中的文档,即注释,如果有相关问题,则直接回答问题。
1.有哪些控制器?
2.有哪些javabean?
3.有哪些页面,为何有些用html,有些用jsp
pre>
纯前端代码就用html, 掺杂点其他的, 就jsp
计算器:
要用到, session存计算结果数据,
// 准备
Computer computer = null;
HttpSession session = request.getSession(true);
try {//存进session中去
computer=(Computer)session.getAttribute("ok");
if (computer==null) {
computer = new Computer();
session.setAttribute("ok", computer);
}
} catch (Exception e) {
computer = new Computer();
session.setAttribute("ok", computer);
}
...
computer.setNum1(num1);//存结果表达式
computer.setNum2(num2);
computer.setOperator(operator);
computer.setResult(result);
展示结果:
运算情况是:
${sessionScope.ok.num1}
${sessionScope.ok.operator }
${sessionScope.ok.num2}=
${sessionScope.ok.result}
文件读写:
简易io文件读取异常处理
三角形:
对请求简单使用
略
END本篇也是比较草草了事, 感谢你的阅读, 看看就好!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)