错误:javalangIllegalArgumentException非法论据异常,也可称为非法形参异常。argument不是参数的意思,是争吵,争论;论据,经常用args用作形参。
在SSM动态javaweb服务器框架中,经常看到这个异常,很多人说这是参数异常,检查自己在ioc容器中配置的参数是否正确,其实这是项目使用的Java编译器(即Javacompiler)使用的jdk版本和Java的运行环境(即jreJavaruntimeenvironment)版本不匹配造成的。
如果jdk使用的是17,jre使用的是18,就会出现这一异常。即使是低版本的编译器,高版本的运行环境,也会出现这一异常。
解决方法如下:
第一:修改Java compiler和jre
1、在eclipse-window-preference-java的里面的installed JREs和Compiler
2、Compiler就是修改编译器的Installed JREs就是改变运行环境。按道理说只要jre的版本高于jdk(即Compiler)的版本,就能运行,因为高版本环境兼容低版本程序。但并不是的,jdk18的修改很大,就算前高后低,仍旧派出这个异常。所以我们都把他们修改成17版本。
Compiler改成17。按下图改成17,然后右下角apply就行了。
3、修改jre为17,看下图,电脑里装了三个jdk版本,选择jdk17,然后spply就行了。
第二:修改tomcat服务容器的JRE
1、因为tomcat是基于java编写的服务容器,所以它是需要java运行环境的。其实这个更容易开发人员忽略,但是这个更重要,因为动态web工程最终是在tomcat里面运行的,而tomcat的运行jre直接决定web工程的jre,而上面配置的就直接没用了,因为用到tomcat了,是web工程,不是纯java工程。
修改tomcat的jre,window-Preferences-Server-Runtime Environments ,电脑里装了两个tomcat容器一个7,一个9,选择一个然后Edit。
2、Edit就是配置的意思,及配置这个选中的tomcat。下面就是配置界面,选择jdk17,然后Finish就就ok了。这样,javalangIllegalArgumentException问题就得到了成功解决。
第一阶段,Java SE基础:
Java环境搭建、Java流程控制语句-for循环、switch选择判断、循环嵌套、数组拷贝、多维数组、final关键字、构造函数的调用、类的访问权限和路径、面向对象高级特性、Java异常处理、Set,Map,List接口及接口实现类、Java线程、同步阻塞、JavaIO流、文件的 *** 作,复制,读写,删除等。
第二阶段,JavaWeb:
MySQL安装、管理、创建数据库、MySQLUPDATE
查询、Mysql高级 *** 作、JDBC、JDBC数据库连接 *** 作,JDBC动态Sql处理、Servlet30 网页重定向、Servlet30
新增的注解支持、AJAX、responseText属性详解等。
第三阶段,Java高级框架-SSH:
Struts2异常处理、Struts2+Log4j集成、Struts2和JSON实例、Hibernate5、Hibernate集合映射、Hibernate组件映射、Spring40、SpringAOP+
AspectJ框架、Spring 与其它Web框架集成、Spring Hibernate支持等。
第四阶段,Java高级框架-SSM:
SpringMVC、Spring MVC生成JSON数据、MyBatis、MyBatis 环境配置及入门、Mybatis set标签、Mybatis trim标签、Shiro、Shiro快速入门教程、Shiro Web应用等。
第五阶段,SpringBoot+VUE全栈框架:
SpringBoot、全局异常处理、过滤器监听器、EHCache缓存、SpringBoot Quartz定时任务、Vue、Vuejs 安装、模板语法、计算属性、事件处理器、Vuejs 自定义指令、Vuejs 路由等
第六阶段,特色课程:
ActiveM环境搭建、生产者和消费者、消息持久化 *** 作、RSA数字加密算法、Codebar条形码生成器、zxing二维码生成器、HighCharts统计图、Echarts统计图、网络播放器ckplayer、嵌入式网络播放器,可以浏览器和移动端随意使用
第七阶段,互联网框架的高级应用1:
分布式服务框架的理解,Dubbo架构设计详解及其核心要点,框架运行原理分析、SpringData数据访问、Lucene搜索引擎、Lucene的全文搜索服务器介绍、索引建立方式、Solr海量数据搜索引擎、Socket网络通信、实现RMI远程对象通讯、使用JMS消息服务、Kafka分布式消息系统、WebService与RestfulWS等
第八阶段,互联网框架的高级应用2:
Spring Security安全框架、实现Web应用安全控制、缓存应用与EhCache框架、OSCache与JBossCache框架、MyBatis与Hibernate缓存机制、NoSQL应用与SQL调优、MongoDB
NoSQL数据库、Redis内存数据库、实现RedisSession共享、SQL语句的优化、实现数据库读写分离、WEB应用集群及性能优化、Maven项目管理工具、Web服务器负载均衡、实现Nginx与Tomcat集群、使用LoadRunner测试工具、性能优化之内存调优、代码优化与重构的方法等。
对java有兴趣的小伙伴们,不妨先从java入门开始!B站上有很多的java教学视频,从基础到高级的都有,还挺不错的,知识点讲的很细致,还有完整版的学习路线图。也可以自己去看看,下载学习试试。先声明这是转的 不是我自己写的: JSP由于其强大的生命力在web开发中有很广泛的应用,实际上在JSP开发中,JSP程序中只占用了很少的一部分,大部分是由JavaBean完成的,通过JavaBean可以封装业务逻辑,数据库处理等等,由于有了JavaBean才使得程序更为健壮,易于扩展。所以,详细的了解JavaBean的基础,对于我们开发出高质量的JSP应用程序是很有帮助 [一、JavaBean在JSP中的基本语法] JSP中JavaBean是通过标签<jsp:useBean>来声明实现的,基本语法如下: <jsp:userBean id="beanName" class="className" scope="page/request/session/application></jsp:userBean> 由于我们讨论的是生存周期,在上面语法中通过scope属性来实现的: scope="page/request/session/application scope的值代表 JavaBean的生存周期,也就是JavaBean的实例id在JSP程序中存在的
范围。下面看看具体的scope四个值的含义: page-JavaBean对象保存在pageContext对象中,有page范围JavaBean实例只能在当前创建这个JavaBean的JSP文件中进行 *** 作, 这个实例只有在请求返回给客户端后或者转移到另外的JSP页面后才会释放掉。page范围的JavaBean常用于进行一次性 *** 作的JavaBean,这样的Bean用的最多,比如大部分表单提交,Bean的一些计算处理等都可以使用page范围的JavaBean request-JavaBean对象保存在request对象中,有request范围的JavaBean实例可以在处理请求所有JSP页面中都存在,这个对象只有在请求全部处理完毕后才会被释放掉,request范围的JavaBean常用于共享同一次请求的JSP页面中,比如判断用户登录功能,如果用户名密码合法就可以forward到一个合法页面中,否则就forward到一个出错页面,当然转移后的页面仍然能够得到用户的输入。 session-JavaBean对象是保存在session范围的JavaBean实例的生存周期是整个session,只有当session过期后才能释放掉,这样常用于共享同一session的JSP页面,比如购物车一般就是放在session中的或者登陆后的用户信息等也可以在session中,注意<%@page标签中不要设置session=false,否则在这个JSP页面中session将不会起作用,幸好JSP默认session=true,所以可以不必管它了。application-JavaBean对象保存在application对象中,有application范围的JavaBean对象的生存周期是整个application。这就意味着这样的JavaBean的生存周期是整个应用程序,当web Server停掉才会消失掉。这样的常用于共享同一application的JSP程序中,比如程序中一些经常用到配置东西如数据库连接URL,全局的计数器或者是聊天室中人员信息等。 [二、scope的具体应用] 上面讲了这么多,大家应用对JavaBean的生存周期有个基本的概念了,在这里我们结合几个简单的例子来看看scope在JavaBean中应用,以便大家能对scope有更深的了解,用来
演示的是一个简单的
积分处理程序,初始化为o,每一次访问会将积分加上10,我们使用了一个JavaBean文件,用于数值计算处理的,然后在前台使用几个scope设置不同的JSP文件调用这个JavaBean。 <核心的JavaBean文件> public class scope { //初始化成员变量,scope_count代表积分分值 int scope_count=10; public scope(){} //构造方法 public int TestNumber(){ scope_count+=10; return scope_count; } //设置scope_count的值 public void setNumber(int ber){ scope_sount=number; } } <page范围的演示> 下面是为了演示page范围的JSP文件pagejsp文件。 pagejsp <%@ page contentType="text/html";charset=gb2312"%> <html><head> <title>page范围积分程序演示</title> </head> <!--初始化JavaBean并生成一个scope的实例--> <jsp:useBean id="jinqiao" scope="page" class="comscope"/> <body> page范围积分程序演示<br> <center>您当前的积分为<%//调用scope中的TestNumber方法得到当前积分 outprintln(jinqiaoTestNumber());%> </center> </body> </html> 好了,启动web服务器,然后运行这个程序,使用浏览器并点击刷新按钮,看屏幕的变化,你会发现结果总是积分为20,这就说明了TestNumber方法只被执行了一欠,因为jinqiao对象的生存范围是page的,所以只在这个页面有效,每一次调用这个JSP页面都会重新生成一个jinqiao对象,当然积分不会变化了。 <request范围的演示> 下面是为了演示request范围的JSP文件requestjsp。 requestjsp <%@ page contentType="text/html";charset=gb2312"%> <html><head> <title>request范围积分程序演示</title> </head> <!--初始化JavaBean并生成一个scope的实例--> <jsp:useBean id="jinqiao" scope="request" class="comscope"/> <body> page范围积分程序演示<br> <center>您当前的积分为<%//调用scope中的TestNumber方法得到当前积分 outprintln(jinqiaosetNumber(18));%> <jsp:forward page=requestjsp/> </center></body></html> request1jsp <%@ page contentType="text/html";charset=gb2312"%> <html><head> <title>page范围积分程序演示</title> </head> <!--初始化JavaBean并生成一个scope的实例--> <jsp:useBean id="jinqiao" scope="request" class="comscope"/> <body> request范围积分程序演示<br> <center>您当前的积分为<%//调用scope中的TestNumber方法得到当前积分 outprintln(jinqiaoTestNumber());%> </center> </body> </html> 好了,启动web服务器,然后运行这个程序,使用浏览器并点击刷新按钮,看屏幕的变化,你会发现结果总是积分为28为什么会有这样一个结果呢,因为首先我们在requestjsp文件中调用了jinqiao对象setNumber方法设置积分值为18,然后我们将请求转移到request1jsp页面,因为同一相应还没有处理完毕,所以在request1jsp中得到的仍然是同一个jinqiao实例,然后通过jinqiao的TestNumber方法将jinqiao的积分18+10,所以就得到了28了。注意的是<jsp:forward>标签是用来将请求转移的两个页面中的Bean声明包括id名字,request范围等要一模一样才行,这样JSP程序才会认为你要调用的是同一个JavaBean实例 <session范围的演示> 下面是为了演示session范围的JSP文件sessionjsp文件, sessionjsp <%@ page contentType="text/html";charset=gb2312"%> <html><head> <title>session范围积分程序演示</title> </head> <!--初始化JavaBean并生成一个scope的实例--> <jsp:useBean id="jinqiao" scope="session" class="comscope"/> <body> session范围积分程序演示<br> <center>您当前的积分为<%//调用scope中的TestNumber方法得到当前积分 outprintln(jinqiaoTestNumber());%> </center> </body> </html> 好了,启动web服务器,然后运行这个程序,使用浏览器并点击刷新按钮,看屏幕的变化,你会发现结果是变化的,开始时是:您当前的积分为20,然后就是30,40。。,这就说明了TestNumber()方法被执行了多次,因为jinqiao对象生存范围是session的,所以在整个session有效,每一次刷新这个jsp页面都会调用同一个jinqiao对象,所以积分都是同一个了, 另外,为了更方便的理解session,可以将上面的sessionjsp文件完整的拷贝一份生成session1jsp文件,在浏览器中执行sessionjsp文件,看积分值的变化,然后还使用同一个浏览器,输入session1jsp文件,你会发现session1jsp和sessionjsp文件的积分值是一模一样的。重新开一个浏览器,注意不用浏览器菜单功能,而是直接从桌面双击一个IE浏览器,而两个浏览器分别运行sessionjsp,session1jsp文件,刷新多次后,你会发现两个浏览器的积分值不一样了,为什么呢?很简单,因为重新打开一个浏览器就相当于重新开一个session。session不同,积分值当然也不同了。 <application范围的演示> applicationjsp <%@ page contentType="text/html";charset=gb2312"%> <html> <head> <title>application范围积分程序演示</title> </head> <!--初始化JavaBean并生成一个scope的实例--> <jsp:useBean id="jinqiao" scope="application" class="comscope"/> <body> session范围积分程序演示<br> <center>您当前的积分为<%//调用scope中的TestNumber方法得到当前积分 outprintln(jinqiaoTestNumber());%> </center> </body> </html> 好了,启动web服务器,然后运行这个程序,使用浏览器并点击刷新按钮,看屏幕的变化,你会发现结果是变化的,和前面的session几乎一样,开始时,你当前的积分为20,然后就是30、40。。,这就说明了TestNubmer()方法被执行了多次,但是它和session有什么不同呢? 为了解决这个问题,可以将上面的applicationjsp文件完整的拷贝一份生成applicationjsp文件,重新开一个浏览器,注意不用浏览器的菜单功能,而是直接从桌面双击一个IE浏览器,两个浏览器分别运行applicationjsp和application1jsp文件中,刷新多 次后,你会发现两个浏览器的积分值完全一样,这就是application的区别了,很简单因为重新打开一个浏览器只是重新开了一个session,application是针对于整个服务器应用程序而言的,应用程序没有关闭,jinqiao对象是全局的,所以积分值当然一样了,只有将web服务器重新启动后,才会重新生成一个jinqiao对象,积分值才会重新计算。 [三、总结] 本文重点阐述了JSP中的JavaBean的生命周期(scope)问题,到这里,通过前面的例子演示相信大家对于JavaBean的生成周 期概念已经比较熟悉了,只要再经过一段时间的实际应用,相信大家对于JSP中使用JavaBean都得心应手。~
评论列表(0条)