在运行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
表达式语言主要有以下几大好处:
- 避免(MyType) request.getAttribute()和myBean.getMyProperty()之类的语句,使页面更简洁;
- 支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;
- 简单明了地表达代码逻辑,使用代码更可读与便于维护。
Struts2 中OGNL表达式的用法:
OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
“#”主要有三种用途:
- 访问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>
“$”有两个主要的用途 :
- 用于在国际化资源文件中,引用OGNL表达式,例子请参考《在Struts 2.0中国际化(i18n)您的应用程序》
- 在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"/>