我试着通过阅读http://java.sun.com/javaee/6/docs/tutorial/doc/gexaf.html来熟悉Java EE 6 .我对JSF的使用有点困惑.
通常,我开发Web App的方式是,Servlet就像一个控制器,JSP就像一个MVC模型中的View.那么JSF是否试图取代这种结构?以下是上述教程的引用:
Servlet最适合面向服务的App和面向表示的App的控制功能,如调度请求
JSF和Facelet更适合生成像XHTML这样的标记,并且通常用于面向表示的App
不确定我是否理解上述引用,他们没有解释什么是面向服务与面向表达.
JavaServer Faces应用程序可以将HTTP请求映射到特定于组件的事件处理,并将组件作为服务器上的有状态对象进行管理.
任何知识渊博的Java开发人员可以给我一个关于JSF,JSP和Servlet的快速概述吗?我是否将它们全部集成在一起,还是在应用程序中将它们分开使用?如果是这样,那么与Servlet和JSP相比,什么样的应用程序使用JSF
JavaServer Faces应用程序可以将HTTP请求映射到特定于组件的事件处理,并将组件作为服务器上的有状态对象进行管理.
听起来像servlet可以做什么,但不确定manage components as stateful objects on the server.甚至不确定这是什么意思?提前致谢.
这个问题不是关于JMX如何工作或JMX的作用.这个问题是关于JMX在生产中的标准应用程序服务器环境中的应用.它也不适用于特定的服务器.
在运行标准Java EE服务堆栈的生产环境中,您使用JMX监控的是什么:数据库访问(JDBC和JPA),会话EJB,JMS,Web服务器,Web服务,支持AJAX的服务?
我已经读过,我可以创建一个javax.ws.rs.ext.ExceptionMapper将抛出的应用程序异常映射到Response对象的实现.
我创建了一个简单的示例,如果持久化对象时手机长度超过20个字符,则抛出异常.我期望将异常映射到HTTP 400(错误请求)响应; 但是,我收到HTTP 500(内部服务器错误),但有以下异常:
java.lang.ClassCastException: com.example.exception.InvalidDataException cannot be cast to java.lang.Error
Run Code Online (Sandbox Code Playgroud)
我错过了什么?任何意见是极大的赞赏.
异常映射器:
@Provider
public class InvalidDataMapper implements ExceptionMapper<InvalidDataException> {
@Override
public Response toResponse(InvalidDataException arg0) {
return Response.status(Response.Status.BAD_REQUEST).build();
}
}
Run Code Online (Sandbox Code Playgroud)
例外类:
public class InvalidDataException extends Exception {
private static final long serialVersionUID = 1L;
public InvalidDataException(String message) {
super(message);
}
...
}
Run Code Online (Sandbox Code Playgroud)
实体类:
@Entity
@Table(name="PERSON")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Person {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="ID")
private Long id;
@Column(name="NAME")
private String name;
@Column(name="PHONE")
private …Run Code Online (Sandbox Code Playgroud) 我在应用服务器上运行了多个Web应用程序,每个Web应用程序WAR文件都包含相同jar文件的副本.
这是否意味着该jar文件中的一个类将在JVM中多次加载,对于它存在的每个WAR文件一次?接下来,如果我在这样的类中有一个静态同步方法,它是否只在它存在的web-app中的线程之间同步,而不是在不同jar文件中的同一个类中的同一方法同步WAR文件?(希望这个问题有道理,必要时会澄清).
如果是这种情况,我认为最好的解决方案是从每个WAR文件中删除jar文件并将其部署到服务器上的共享类路径文件夹中?
我正在迁移我们的java-ee项目以使用Maven而不是Ant.
对于以下依赖项
<dependency>
<groupId>javolution</groupId>
<artifactId>javolution</artifactId>
<version>5.4.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
尝试编译时出现以下错误
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.
3.2:compile (default-compile) on project JAdaptiv: Compilation failure
[ERROR] error: error reading C:\Users\User.IVSTEL1\.m2\repository\javolution\
javolution\5.4.2\javolution-5.4.2.jar; invalid CEN header (bad signature)
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal o
rg.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on
project JAdaptiv: Compilation failure
error: error reading C:\Users\User.IVSTEL1\.m2\repository\javolution\javoluti
on\5.4.2\javolution-5.4.2.jar; invalid CEN header (bad signature)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct(LifecycleModuleBuilder.java:84)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct(LifecycleModuleBuilder.java:59)
at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBu
ild(LifecycleStarter.java:183)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(Lifecycl
eStarter.java:161) …Run Code Online (Sandbox Code Playgroud) 在@PostConstruct文档中,它描述了带注释的方法:
"该方法绝不能抛出已检查的异常."
如何处理例如可以在这种方法中抛出的IOException?只需将其包装在RuntimeException中,让用户担心对象的错误初始状态?或者@PostConstruct是错误的地方来验证和初始化注入了依赖项的对象?
我正在使用JSF,PrimeFaces,Glassfish和Netbeans构建我的第一个Java EE应用程序.因为我是新手,所以我可能会接近核心问题.
核心问题:我想安全地维护用户的信息.关于是否应该在JSF会话bean或有状态会话EJB中维护它似乎存在矛盾的想法.我正在尝试使用有状态会话EJB,因为它更安全.
问题是我的应用程序似乎正在创建该bean的多个实例,当我希望它创建一个并重新使用它时.如果我刷新页面它运行@PostConstruct和@PostActivate3次,他们都用不同的实例.然后,当我重新部署应用程序时,它们都会被破坏.
我误解了它应该如何工作或错误配置了什么?
我将尝试显示一个修剪过的代码示例:
basic.xhtml:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
Hello from Facelets
<c:if test="#{loginController.authenticated}">
Authenticated
</c:if>
<c:if test="#{loginController.authenticated}">
Authenticated
</c:if>
<c:if test="#{loginController.authenticated}">
Authenticated
</c:if>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
LoginController:
@Named(value = "loginController")
@RequestScoped
public class LoginController implements Serializable {
@EJB
private UserBeanLocal userBean;
public boolean isAuthenticated() {
return userBean.isAuthenticated();
}
}
Run Code Online (Sandbox Code Playgroud)
UserBean(不包括UserBeanLocal界面)
@Stateful
public …Run Code Online (Sandbox Code Playgroud) 我尝试使用Maven将我的应用程序部署到Tomcat,我发现了这个示例.
这是我的pom.xml的片段:
<!-- Maven Tomcat Plugin -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<url>http://127.0.0.1:8080/</url>
<server>TomcatServer</server>
</configuration>
</plugin>
<!-- Maven compiler plugin -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
当我跑步时,tomcat:deploy我得到这个错误:Cannot invoke Tomcat manager: Connection refused.这是完整的堆栈跟踪:
[ERROR] Failed to execute goal org.codehaus.mojo:tomcat-maven-plugin:1.1:deploy (default-cli) on project webapp: Cannot invoke Tomcat manager: Connection refused: connect -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:tomcat-maven-plugin:1.1:deploy (default-cli) on project webapp: Cannot invoke Tomcat manager
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at …Run Code Online (Sandbox Code Playgroud) 我必须更新数据库中的信息.
FacadePatient.java 班级代码:
public Patient update(Patient p) {
Patient pat = em.find(Patient.class, p.getPatientId());
p.setPatientPhone(pat.getPatientPhone());
p.setPatientDateNaiss(pat.getPatientDateNaiss());
p.setPatientEmail(pat.getPatientEmail());
p.setPatientJob(pat.getPatientJob());
p.setPatientSmoking(pat.getPatientSmoking());
p.setPatientSize(pat.getPatientSize());
em.merge(pat);
return p;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试习惯JSF如何处理数据(来自弹簧背景)
我正在创建一个维护用户列表的简单示例,我有类似的东西
<h:dataTable value="#{userListController.userList}" var="u">
<h:column>#{u.userId}</h:column>
<h:column>#{u.userName}</h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)
然后"控制器"有类似的东西
@Named(value = "userListController")
@SessionScoped
public class UserListController {
@EJB
private UserListService userListService;
private List<User> userList;
public List<User> getUserList() {
userList = userListService.getUsers();
return userList;
}
}
Run Code Online (Sandbox Code Playgroud)
而"服务"(虽然看起来更像是DAO)有
public class UserListService {
@PersistenceContext
private EntityManager em;
public List<User> getUsers() {
Query query = em.createQuery("SELECT u from User as u");
return query.getResultList();
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的做事方式吗?我的术语是对的吗?"服务"感觉更像是DAO?控制器感觉它正在做一些服务工作.