记一次eclipse无法部署tomcat服务器

本文记录了一次在Eclipse中无法部署Tomcat服务器的问题,描述了手动运行服务器的情况。同时,文章深入讲解了URI与URL的区别、URL的语法,并详细介绍了Struts2的相关内容,包括标签库、struts.properties、struts.xml、ServletActionContext、国际化以及OGNL表达式在Struts2中的应用。最后讨论了Action的参数接收方式,包括ActionContext、Action属性、DomainModel属性和ModelDriven接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在运行tomcat服务器时,发现无法打开。我在tomcat服务器目录下手动运行tomcat服务器,在浏览器输入localhost是可以打开欢迎页的,但是在eclipse上运行就无法打开。

uri 和 url

        URI:统一资源标志符(Uniform Resource Identifier)
        URL:统一资源定位符(uniform resource location)
       说白了,URI与URL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。
       换句话说,每个URL都是URI,但是不是每个URI都是URL的。他们之间最明显的不同就是在java.net.URI你只能看到他的一些属性,他只是表示一个位置,但是你没有办法通过URI获取到这个对象的流,但是URL就不同了。java.net.URL该类提供方法(openConnection()),通过该方法我们可以通过IO流操作他。但是URI中我貌似没看到相关的方法。
       也就是说:URL是可以直接操作的,但是URI并不行。

URL的语法

       URL与URI很像,两者的格式几乎差不多,但是我们接触的还是URL比较多,就以URL为例说明
       URL提供了一种访问定位因特网上任意资源的手段,但是这些资源可以通过不同的方法(例如HTTP、FTP、SMTP)来访问,不管怎样,他都基本上由9个部分构成:
       ://:@:/;?#
        scheme:获取资源使用的协议,例如http、ftp等,没有默认值
       user:password:用户名与密码,这个是一个特殊的存在,一般访问ftp时会用到,他显示的表明了访问资源的用户名与密码。但是这个可以不写,不写的话可能会让你输入用户名密码
       host:主机,访问那台主机,有时候可以是IP,有时候是主机名,例如www.baidu.com
       port:端口,访问主机时的端口,如果http访问默认80,可以省略。
       path:通过host:port我们能找到主机,但是主机上文件很多,通过path则可以定位具体文件。例如www.baidu.com/file/index.html。则path是/file/index.html,表示我们访问/file/index.html这个文件,他很像linux上的路径。
       params:这个很少见,主要作用就是像服务器提供额外的参数,用来表示本次请求的一些特性。例如ftp传输模式有两种,二进制和文本,你肯定不希望使用文本形式传输二进制图片,这样你的图片下载下来后可能没法看了。为了向应用程序提供更丰富的信息,URL中有个专门的部分来表示这种参数。例如ftp://file.qiandu.com/pub/guid.pdf;type=d其中的type=d就是params
       query:通过get方式请求的参数,例如:www.qiandu.com/index.html?username=dgh&passwd=123
       fragment:例如www.qiandu.com/index.html#1。当html页面比较长时,我们通常会将其分为好几段,#1就可以 快速定位到某一段。

struts2标签库

<%@ taglib prefix=”s” uri=”/struts-tags”%>是引入struts2的标签库.你只要把struts2相关的几个lib放在你工程的WEB-INF/lib/下面就可以了.如:struts2-core-2.0.11.1.jar ognl-2.6.11.jar oro-2.0.8.jar freemarker-2.3.8.jar struts-core-1.3.5.jar 等等.

<%@ taglib prefix=”s” uri=”/struts-tags” %>就是从地址/struts-tags下面寻找标签库,它定义在Struts 2库文件struts2-core-2.0.11.jar里面的文件META-INF/lib/struts-tags.tld里面。

struts-tags.tld详解()

       文档非常详细的指出标签 未完待续

struts.properties

struts.xml

ServletActionContext

constant

https://blog.youkuaiyun.com/elimago/article/details/3601579

国际化

程序设计中凡是要输出国际化信息的部分,不要直接输出,而是先输出到一个简短的key值,在不同语言环境下可以对应不同的字符串,程序显示时,再根据不同的语言环境,加载key值对应的字符串。

编写国际化资源文件

包范围资源文件、类范围资源文件、临时资源文件、全局资源文件。

包范围资源文件

放在包下,只允许包下的action访问,格式为package_language_country.properties,package是固定不变的。

类范围资源文件

只能被指定的类所对应的action访问,要放到action类所在路径下。

全局范围资源文件

baseName_lang_country.properties 或者 name.properties 都是直接自定义name,全局范围资源加载不是自动在配置文件中的struts.custom.i18n.resources中进行配置,值为baseName.配置好后struts2可以在任何地方取出这些国际化资源文件。

临时资源文件

在JSP中指定,通过Struts2标签才可以访问你该文件信息.

Struts OGNL

表达式语言主要有以下几大好处:

  1. 避免(MyType) request.getAttribute()和myBean.getMyProperty()之类的语句,使页面更简洁;
  2. 支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;
  3. 简单明了地表达代码逻辑,使用代码更可读与便于维护。

Struts2 中OGNL表达式的用法:

OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;

“#”主要有三种用途:
  1. 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
名称作用例子
parameters包含当前HTTP请求参数的Map#parameters.id[0]作用相当于request.getParameter(“id”)
request包含当前HttpServletRequest的属性(attribute)的Map#request.userName相当于request.getAttribute(“userName”)
session包含当前HttpSession的属性(attribute)的Map#session.userName相当于session.getAttribute(“userName”)
application包含当前应用的ServletContext的属性(attribute)的Map#application.userName相当于application.getAttribute(“userName”)
attr用于按request > session > application顺序访问其属性(attribute)#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止

2. 用于过滤和投影(projecting)集合,如books.{?#this.price<100};
3. 构造Map,如#{‘foo1’:’bar1’, ‘foo2’:’bar2’}。

“%”的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:
    <hr />   
    <h3>%的用途</h3>   
    <p><s:url value="#foobar['foo1']" /></p>   
    <p><s:url value="%{#foobar['foo1']}" /></p>   
“$”有两个主要的用途 :
  1. 用于在国际化资源文件中,引用OGNL表达式,例子请参考《在Struts 2.0中国际化(i18n)您的应用程序》
  2. 在Struts 2配置文件中,引用OGNL表达式,如
      <action name="AddPhoto" class="addPhoto">   
                  <interceptor-ref name="fileUploadStack" />               
                  <result type="redirect">ListPhotos.action?albumId=${albumId}</result>   
              </action>

例如: Struts2 在标签的ID属性中 获取 索引:

<s:iterator value="userList" status="u"> 
   <s:hidden id="%{u.index }" value="%{name }"></s:hidden> 
   <s:hidden id="%{u.index }" value="%{sex }"></s:hidden> 
</s:iterator> 

注意:
- Struts2标签与内部标签之间元素互用使用%{u.index }或者%{#u.index },比如:<s:iterator><s:a>
- Struts2标签与外部标签元素互用则使用 ${#u.index } 比如:<s:iterator><a>

Action

使用ActionContext接收参数

这里是一篇关于获取内置对象的文章
struts2框架提供ActionContext类来访问ServletAPI,几种常用方法如下:
- put(String key,Object value) 模拟Servlet API中的HttpServletRequest的setAttribute方法
- get通过参数key来查找当前ActionContext中的值
- Map getApplication()返回一个Application级的Map对象
- Static ActionContext getContext() 返回当前的ActionContext对象
- Map getSession

使用Action属性接收参数

我们需要在Action中接收从页面传递过来的参数,但是在Action中并没有request,session,application对象(其实是可以获取的,),这个就不能像我们在jsp、servlet中那样接收参数了。但是struts已经想到了这一点,也已经设计好了方法帮助我们去接收参数。

在这个类中定义了name和age属性,并且实现了对应的get、set方法。这个看起来类似javabean,但是它并不是标准的javabean。

package com.mengxiangyue.struts2.user.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {

    private String name;
    private int age;

    public String add() {
        System.out.println("name=" + name);
        System.out.println("age=" + age);
        return SUCCESS;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

有了这个Action后,我们就可以在页面中直接使用这样的方法传递参数了:<a href="user/user!add?name=a&age=8">。这里使用的连接的方式,我们也可以改成使用表单。使用这样的方式,struts会自动将传递过来的参数值赋值给对应的属性。这里说明一点,在这里struts使用的是对应的set方法,不是直接对属性赋值,所以我们可以将里面的属性名字随便写,只要对应的set方法与传递的参数对应就可以了。但是一般不这么做。

使用DomainModel属性接收参数

使用域模型接收参数是最常用的。

package com.mengxiangyue.struts2.user.action;

import com.mengxiangyue.struts2.user.model.User;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {

    private User user;

    public String add() {
        System.out.println("name=" + user.getName());
        System.out.println("age=" + user.getAge());
        return SUCCESS;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}
package com.mengxiangyue.struts2.user.model;

public class User {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

这个User类,就是一个javabean。
这两个类写好了之后,struts.xml配置好了之后,我们就可以使用下面的方法进行调用了:<a href="user/user!add?user.name=a&user.age=8">。在这里我们可以直接使用user对象+”.”+属性名进行传值。其他的工作struts都会帮助我们完成的。Struts首先会new一个Action对象,然后new一个User对象user,我们在Action中只是声明了此对象,struts会自动帮我们赋值的。然后会调用对应的user的set方法,并且将值赋给它们。这样我们就可以使用了。

上面的程序运行的时候会在后台答应出来对应的值。

使用ModelDriven接收参数

只需定义相应的model,struts框架将post方法向服务器提交的HTTP信息赋给相应的model

package com.mengxiangyue.struts2.user.action;


import com.mengxiangyue.struts2.user.model.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.MOdelDriven;

public class UserAction extends ActionSupport {

    //创建userModel实例
    private User user;
    //getter方法必须实现
    public User getUser(){
        return user;
    }
    public String execute() {
        ActionContext .getContext().put("user",user);
        return SUCCESS;
    }


    public void setUser(User user) {
        this.user = user;
    }

}
success.jsp
<s:property value="#user.name"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值