j2ee上机任务汇总(下)

23 篇文章 1 订阅

前言:

这里主要是自己大二的学校课程下的上机任务[下]!
本篇也是比较草草了事, 感谢你的阅读, 看看就好!

war包:

第17个war包:

补充知识war和exploded的小坑

  1. war模式:将WEB工程以包的形式上传到服务器 ;对于本地,就是把war包上传到了tomcat的文件目录下面
  2. 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
 * <h1> 这是一个javabean,用于数据封装 </h1>
 * <li> 思考下:它的规范是什么?
 */
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>FilterChina01</filter-name>
    <filter-class>cn.edu.cuit.filterChain.FilterChain01</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>FilterChina01</filter-name>
    <url-pattern>/ServletForFilterChain</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>FilterChina02</filter-name>
    <filter-class>cn.edu.cuit.filterChain.FilterChain02</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>FilterChina02</filter-name>
    <url-pattern>/ServletForFilterChain</url-pattern>
  </filter-mapping>

不难发现:想要形成过滤链,对多个过滤器都包含的同一个请求,按web.xml中文件的配置顺序执行filter

先访问下:

http://localhost:8080/17/ServletForFilterChain

image-20220425181931117

image-20220425182002979

出现乱码一般解决方案:

request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");

为了监听器listener能运行起:

web.xml配置一下:

<!--配置监听器-->
<listener>
    <listener-class>com.feng.listener.OnLineCountListener</listener-class>
</listener>

这个项目主要访问一下这个请求:

启动项目直接访问下面url:

http://localhost:8080/17/listener/login.jsp

image-20220425182514805

同时修改提交url为../servlet/LoginAllServlet

image-20220425182729981

登录三个人;

image-20220425182906641

重复登录:

image-20220425183035232

image-20220425183111430

	/**
	 * <li> 控制器核心动作
	 */
	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;  // 上下文对象

image-20220426135138708

给每个用户的对话session给设置过期时间:

web中配置的一分钟

  <session-config>
    <!-- 设置一个当前session失效的时间:1分钟 -->
    <session-timeout>1</session-timeout>
  </session-config>

一分钟后, Session就会销毁:

image-20220425183731448

如果要创建多个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
 * <h1> 监听器实现如下监听 </h1>
 * <li> 1.ServletContextListener 上下文变更监听器
 * <li> 2.HttpSessionListener 会话变更监听器
 * <li> 3.HttpSessionAttributeListener 会话属性变更监听器
 * <li> 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;

	/**
	 * <li> 上下文的初始化
	 */
	public void contextInitialized(ServletContextEvent sce) {
		this.application = sce.getServletContext();
		this.application.setAttribute("users", new ArrayList<String>());
//		List<User> users = (List<User>) this.application.getAttribute("users");
		System.out.println("监听器日志:/t监听器完成上下文对象的获取");
		System.out.println("监听器日志:/t监听器完成用户列表的初始化");
	}

	/**
	 * <li> 上下文的销毁
	 */
	public void contextDestroyed(ServletContextEvent sce) {
	}

	/**
	 * <li> session的创建
	 */
	public void sessionCreated(HttpSessionEvent se) {
		session.setMaxInactiveInterval(5);
		System.out.println("监听器日志:/t一个Session创建了!");
	}

	/**
	 * <li> 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被销毁掉了!");
	}

	/**
	 * <li> 属性的添加
	 */
	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一个属性添加完成了");
	}

	/**
	 * <li> 属性的移除
	 */
	public void attributeRemoved(HttpSessionBindingEvent se) {
		System.out.println("属性有移除");
	}

	/**
	 * <li> 属性的替换【更新】
	 */
	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"%>

image-20220425190124239

image-20220425190120113

第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:

//由下题知道
<!-- 在页面中使用javabean -->
<jsp:useBean id="article" class="bean.Article"></jsp:useBean>
<jsp:setProperty property="id" name="article" value="25" />
<jsp:setProperty property="title" name="article" value="信JAVA,高工资,走上人生癫疯" />
<jsp:setProperty property="author" name="article" value="小小" />


<hr/>Bean的使用<br />
<p>
编号:<jsp:getProperty property="id" name="article" /><br />
书名:<jsp:getProperty property="title" name="article" /><br />
作者:<jsp:getProperty property="author" name="article" /><br />
</p>

用镶嵌的java代码实现
<%
Article article1=new Article();
article1.setId(50);
article1.setTitle("JAVAEE挂科就是拥有不一样的计算机人生经历");
article1.setAuthor("小小小");
%>
<p>
编号1:<%=article1.getId() %><br />
书名1:<%=article1.getTitle() %><br />
作者1:<%=article1.getAuthor() %><br />
</p>
<br />

人有点麻, 我们就简单访问一下吧!

第20个war包:

实验要求:

<pre>
自行完成相应的动作和思考
0.读完程序中的文档,即注释,如果有相关问题,则直接回答问题。

1 数据的封装是用什么来实现的
2从控制器过来就有数据,而直接访问employee.jsp就没有数据,为啥?在控制器里面实例化的javabean
3在有数据和没有数据的情况下,el表达式的表现如何?就没有显示
4使用el表达式时,有哪两种方式来获取相应的值?
5在el表达式中的值,是一个对象吗?好像是
6如何直接用el表达式显示浏览器请求的头信息里的键值?
</pre>

EL表达式完全攻略 (biancheng.net)

一些el表达式小应用

<body>
	语言accept-language: ${header['accept-language']}
	<br/>
	会话编号session id: ${pageContext.session.id}
	<br/>
	雇员信息employee: 
	&nbsp;&nbsp;&nbsp;&nbsp;${requestScope.employee.name},<br/>
	&nbsp;&nbsp;&nbsp;&nbsp;${employee.address.country},<br/>
	&nbsp;&nbsp;&nbsp;&nbsp;${employee.address.state},<br/>
	&nbsp;&nbsp;&nbsp;&nbsp;${employee.address.city},<br/>
	
	<br/><hr/>
	首都信息<br/>
	&nbsp;&nbsp;&nbsp;&nbsp;capital: ${capitals["中国"]},<br/>
	&nbsp;&nbsp;&nbsp;&nbsp;capital: ${capitals["加拿小"]},<br/>
	&nbsp;&nbsp;&nbsp;&nbsp;capital: ${capitals["奥地不利"]},<br/>
	&nbsp;&nbsp;&nbsp;&nbsp;capital: ${capitals["奥小利亚"]},<br/>
</body>

第21个war包:

<pre>
自行完成相应的动作和思考
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暂时没找到!

</pre>

1 对base href=“路径”,基路径的理解_lllllzllll的博客-CSDN博客_base href

String path = request.getContextPath();//获取上下文
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

2相对路径和绝对路径的优缺点_tianhandigeng1498的博客-CSDN博客_相对路径和绝对路径的优缺点

3到层用包装类

自动装配:

<jsp:useBean id="user" class="cn.edu.cuit.bean.User" scope="page"></jsp:useBean>
<!-- 这里使用了自动装配属性 -->
<jsp:setProperty property="*" name="user"/>

第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:

<body>
    <h1>比较运算符</h1>
    <b>
        4 &gt; 3 ${4 > 3}<br/>
        4 &lt; 3 ${4 < 3}<br/>
        4 &ge; 3 ${4 >= 3}<br/>
        4 &le; 3 ${4 le 3} <br/>
        4 = 4 ${4 == 4}
    </b>
    <h1>Empty 运算符</h1>
    <b>
        empty " " ${empty " "}<br/>
        empty "" ${empty ""}<br/>
        empty " sometext " ${empty " sometext "}<br/>
    </b>
</body>	

image-20220426135447189

jstl01.jsp:

	<body>
		欢迎测试你的第一个使用到JSTL的网页<br />
		<c:out value="欢迎测试你的第一个使用到JSTL的网页" />
		<br />
		你使用的浏览器是:
		</br>
		<c:out value="${header['User-Agent']}" escapeXml="true" />
		<hr />
		<br />
		<c:out value="${header['User-Agent']}" escapeXml="false" />
		<hr />
		<br />
		<c:set var="a" value="David O'Davies" />
		<c:out value="${a}"/>
	</body>

image-20220426135706566

jstlCcatch01.jsp:

在jsp中捕获异常!

<body>
   <c:catch var="error_Message">
   <%
        String eFormat="not number,不是一个数的格式";
        int i=Integer.parseInt(eFormat);
   %>
   </c:catch>
   ${error_Message}
</body>

image-20220426140036080

jstLCout01.jsp:

<body>    
   <c:out value="Hello JSP 2.0 !! " /> <br/>
   <c:out value="${ 3 + 5 }" /> <br/>
   <c:out value="${ param.data }" default="No Data" /> <br/>
   <c:out value="<B>有特殊字符</B>" /> <br/>
   <c:out value="<B>有特殊字符</B>" escapeXml="false" /> 
</body>

image-20220426140006168

第23个war包:

<pre>
自行完成相应的动作和思考
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请自行整理各页面中的知识点,试着组织成一条线,写好小结

</pre>
<%@ 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);

展示结果:

运算情况是:<br />
${sessionScope.ok.num1}
${sessionScope.ok.operator }
${sessionScope.ok.num2}=
${sessionScope.ok.result}
<hr />

文件读写:

简易io文件读取异常处理

三角形:

对请求简单使用

END

本篇也是比较草草了事, 感谢你的阅读, 看看就好!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴趣使然的小小

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值