完整的WebApplication JSF EJB JPA JAAS –第2部分

视图–创建和JSF设置

本教程是第1部分的继续。

让我们创建一个新的Dynamic Web Project 。 如下图所示创建它:

注意:在某些时候,Eclipse会询问您是否要添加JSF功能(自动完成),然后启用它。 就像下面的屏幕一样:

创建项目后,让我们编辑“ web.xml”文件; 它应该具有与以下相同的代码:

<?xml version='1.0' encoding='UTF-8'?>
<web-app xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns='http://java.sun.com/xml/ns/javaee' xmlns:web='http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd'xsi:schemaLocation='http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd'id='WebApp_ID' version='3.0'><display-name>CrudJSF</display-name><welcome-file-list><welcome-file>pages/protected/user/listAllDogs.xhtml</welcome-file></welcome-file-list><servlet><servlet-name>Faces Servlet</servlet-name><servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>Faces Servlet</servlet-name><url-pattern>/faces/*</url-pattern><url-pattern>*.jsf</url-pattern><url-pattern>*.xhtml</url-pattern></servlet-mapping><!-- Protected area definition --><security-constraint><web-resource-collection><web-resource-name>Restricted Area - ADMIN Only</web-resource-name><url-pattern>/pages/protected/admin/*</url-pattern></web-resource-collection><auth-constraint><role-name>ADMIN</role-name></auth-constraint></security-constraint><security-constraint><web-resource-collection><web-resource-name>Restricted Area - USER and ADMIN</web-resource-name><url-pattern>/pages/protected/user/*</url-pattern></web-resource-collection><auth-constraint><role-name>USER</role-name><role-name>ADMIN</role-name></auth-constraint></security-constraint><!-- Login page --><login-config><auth-method>FORM</auth-method><form-login-config><form-login-page>/pages/public/login.xhtml</form-login-page><form-error-page>/pages/public/loginError.xhtml</form-error-page></form-login-config></login-config><!-- System roles --><security-role><role-name>ADMIN</role-name></security-role><security-role><role-name>USER</role-name></security-role>
</web-app>

您不必担心是否会出现一些警告/错误。 我们稍后会解决。 请注意,我已经添加了我们需要的所有JAAS代码(如果您想获得有关这些JAAS配置的详细信息,可以在此处进行检查: 使用JAAS和JSF的用户登录验证 )。

根据JAAS的配置,普通用户(USER角色)将只看到用户文件夹中的文件,而这些文件仅仅是我们数据库中记录的狗的列表; ADMIN将能够执行所有CRUD操作,因为所有页面都位于admins文件夹内。

我们的“ faces-config.xml”应具有以下代码:

<?xml version='1.0' encoding='UTF-8'?><faces-configxmlns='http://java.sun.com/xml/ns/javaee'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd'version='2.0'><navigation-rule><navigation-case><from-outcome>logout</from-outcome><to-view-id>/pages/protected/user/listAllDogs.xhtml</to-view-id><redirect/></navigation-case></navigation-rule><navigation-rule><navigation-case><from-outcome>listAllDogs</from-outcome><to-view-id>/pages/protected/user/listAllDogs.xhtml</to-view-id></navigation-case></navigation-rule><navigation-rule><navigation-case><from-outcome>createDog</from-outcome><to-view-id>/pages/protected/admin/createDog.xhtml</to-view-id><redirect/></navigation-case></navigation-rule><navigation-rule><navigation-case><from-outcome>updateDog</from-outcome><to-view-id>/pages/protected/admin/updateDog.xhtml</to-view-id></navigation-case></navigation-rule><navigation-rule><navigation-case><from-outcome>deleteDog</from-outcome><to-view-id>/pages/protected/admin/deleteDog.xhtml</to-view-id></navigation-case></navigation-rule><application><resource-bundle><base-name>messages</base-name><var>msgs</var></resource-bundle></application></faces-config>

注意,对于某些操作,我使用了重定向操作。 通过此操作,我们将更新浏览器URL栏中的请求链接,URL更新后,JAAS将拒绝对非法用户的访问。

我们还有一个文件,其中包含我们系统的所有消息。 您会注意到,页面中显示的所有文本都在此文件中(在src文件夹中创建一个名为“ messages.properties”的文件):

#Dog
dog=Dog
dogName=Name
dogWeight=Weight#Dog messages
dogCreateHeader=Create a new Dog
dogUpdateHeader=Update the Dog
dogDeleteHeader=Delete this Dog
dogNameRequired=The dog needs a name.
dogWeightRequired=The dog needs a weight.#Actions
update=Update
create=Create
delete=Delete
cancel=Cancel#Login
loginHello=Hello
loginErrorMessage=Could not login. Check you UserName/Password
loginUserName=Username
loginPassword=Password
logout=Log Out

视图–创建和JSF设置

现在让我们创建ManagedBeans。

首先,我们需要将EJB添加到Web项目中。 用鼠标右键单击JSF项目>属性:

Java构建路径>项目>添加>检查CrudEJB>确定

首先,让我们创建DogMB:

package com.mb;import java.util.List;import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;import com.facade.DogFacade;
import com.model.Dog;@ManagedBean
@RequestScoped
public class DogMB {@EJBprivate DogFacade dogFacade;private static final String CREATE_DOG = 'createDog';private static final String DELETE_DOG = 'deleteDog';private static final String UPDATE_DOG = 'updateDog';private static final String LIST_ALL_DOGS = 'listAllDogs';private static final String STAY_IN_THE_SAME_PAGE = null;private Dog dog;public Dog getDog() {if(dog == null){dog = new Dog();}return dog;}public void setDog(Dog dog) {this.dog = dog;}public List<Dog> getAllDogs() {return dogFacade.findAll();}public String updateDogStart(){return UPDATE_DOG;}public String updateDogEnd(){try {dogFacade.update(dog);} catch (EJBException e) {sendErrorMessageToUser('Error. Check if the weight is above 0 or call the adm');return STAY_IN_THE_SAME_PAGE;}sendInfoMessageToUser('Operation Complete: Update');return LIST_ALL_DOGS;}public String deleteDogStart(){return DELETE_DOG;}public String deleteDogEnd(){try {dogFacade.delete(dog);} catch (EJBException e) {sendErrorMessageToUser('Error. Call the ADM');return STAY_IN_THE_SAME_PAGE;}   sendInfoMessageToUser('Operation Complete: Delete');return LIST_ALL_DOGS;}public String createDogStart(){return CREATE_DOG;}public String createDogEnd(){try {dogFacade.save(dog);} catch (EJBException e) {sendErrorMessageToUser('Error. Check if the weight is above 0 or call the adm');return STAY_IN_THE_SAME_PAGE;}  sendInfoMessageToUser('Operation Complete: Create');return LIST_ALL_DOGS;}public String listAllDogs(){return LIST_ALL_DOGS;}private void sendInfoMessageToUser(String message){FacesContext context = getContext();context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, message, message));}private void sendErrorMessageToUser(String message){FacesContext context = getContext();context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, message));}private FacesContext getContext() {FacesContext context = FacesContext.getCurrentInstance();return context;}
}

关于上面的代码:

  • 您将在faces-config.xml中找到所有导航。 您应该在页面导航中使用常量或资源包; 与仅在方法中保留字符串相比,这种方法是一种更好的方法。
  • 注意,我们仅使用@EJB将EJB注入MB内。 发生这种情况是因为我们正在使用同一个EAR中的所有东西。 JBoss 7使这种本地化变得容易。
  • 如果注入不适用于JBoss 6(或者在EAR之外使用EJB jar),则可以使用如下注入:@EJB(mappedName =“ DogFacadeImp / local”)。
  • 注意,将向我们的系统用户显示一条消息。 我们会对在Façade中执行的每个动作进行尝试/捕获,如果发生某些错误,我们将向用户发送错误消息。
  • 正确的操作是验证ManagedBean和Façade中的数据。 这些验证的CPU成本较低。
  • 如果您正在使用JBoss 4.2,则需要像下面的代码那样进行JNDI查找(就像本文前面所说的那样,使用LocalBinding批注)。 像这样注释您的班级:
    @Stateless
    @LocalBinding(jndiBinding='MyBean')
    public class MyBeanImp implements MyBean{@Overridepublic String hello() {return 'Value From EJB';}
    }
    // In your Servlet class you would lookup like the code bellow:
    public class Inject extends HttpServlet {private MyBean local;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {InitialContext iniCtx = new InitialContext();local = (MyBean) iniCtx.lookup('MyBean');} catch (NamingException e) {e.printStackTrace();}System.out.println(local.hello());request.getRequestDispatcher('/finish.jsp').forward(request, response);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
    }

现在,让我们看看UserMB:

package com.mb;import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;import com.facade.UserFacade;
import com.model.User;@SessionScoped
@ManagedBean
public class UserMB {private User user;@EJBprivate UserFacade userFacade;public User getUser(){if(user == null){ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();String userEmail = context.getUserPrincipal().getName();user = userFacade.findUserByEmail(userEmail);}return user;}public boolean isUserAdmin(){return getRequest().isUserInRole('ADMIN');}public String logOut(){getRequest().getSession().invalidate();return 'logout';}private HttpServletRequest getRequest() {return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();}
}

关于上面的代码:

  • 该MB仅用于存储我们应用程序的会话用户。 您将使用此MB显示用户名或有关应用程序用户的任何其他操作。
  • 注意,这是一个会话MB; 我们只检查一次用户是否为null,如果返回true,我们将转到数据库。 在这种情况下,我们将只获得一次数据库保存性能。
  • 如果@EJB注入引发异常,请检查上面DogMB中给出的技巧。

查看–页面

下面是页面,css及其各自的路径:

不要介意上面图片中显示的询问图标或任何其他图标类型。 这些是指向我的代码的版本控制图标。 始终保存您的代码。

我在ManagedBean中使用RequestScope,这就是为什么您会在所有页面中看到h:inputHidden的原因。 我认为用RequestScope MB重复此字段是一种更好的方法,因为您将拥有更多的可用内存,而不是使用SessionScope MB。

/WebContent/resources/css/main.css

.table {border-collapse: collapse;
}.tableColumnsHeader {text-align: center;background: none repeat scroll 0 0 #E5E5E5;border-bottom: 1px solid #BBBBBB;padding: 16px;
}.tableFirstLine {text-align: center;background: none repeat scroll 0 0 #F9F9F9;border-top: 1px solid #BBBBBB;
}.tableNextLine {text-align: center;background: none repeat scroll 0 0 #FFFFFFF;border-top: 1px solid #BBBBBB;
}.panelGrid {border: 1px solid;
}.panelFirstLine {text-align: center;border-top: 1px solid #BBBBBB;
}.panelNextLine {text-align: center;border-top: 1px solid #BBBBBB;
}

/WebContent/pages/public/login.xhtml

<!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:f='http://java.sun.com/jsf/core'xmlns:h='http://java.sun.com/jsf/html'xmlns:ui='http://java.sun.com/jsf/facelets'>
<h:head><h:outputStylesheet library='css' name='main.css' />
</h:head>
<h:body><p>Login to access secure pages:</p><form method='post' action='j_security_check'><h:messages layout='table' errorStyle='background: #AFEEEE;'infoStyle='background: #AFEEEE;' globalOnly='true' /><h:panelGrid columns='2'><h:outputLabel value='Username: ' /><input type='text' id='j_username' name='j_username' /><h:outputLabel value='Password: ' /><input type='password' id='j_password' name='j_password' /><h:outputText value='' /><h:panelGrid columns='1'><input type='submit' name='submit' value='Login' /></h:panelGrid></h:panelGrid><br /></form>
</h:body>
</html>

注意我们如何像导入库一样导入css。 您在form标签中看到的动作指向我们一个未知的动作,但是JAAS负责管理该动作。
/WebContent/pages/public/loginError.xhtml

<!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:f='http://java.sun.com/jsf/core'xmlns:h='http://java.sun.com/jsf/html'xmlns:ui='http://java.sun.com/jsf/facelets'>
<h:head><h:outputStylesheet library='css' name='main.css' />
</h:head>
<h:body>#{msgs.loginErrorMessage}
</h:body>
</html>

/WebContent/pages/protected/user/listAllDogs.xhtml

<!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:f='http://java.sun.com/jsf/core'xmlns:h='http://java.sun.com/jsf/html'xmlns:ui='http://java.sun.com/jsf/facelets'>
<h:head><h:outputStylesheet library='css' name='main.css' />
</h:head>
<h:body><h:form><h3>#{msgs.loginHello}: #{userMB.user.name} || <h:commandLink action='#{userMB.logOut()}' value='#{msgs.logout}' /> </h3><h:messages /><h:dataTable value='#{dogMB.allDogs}' var='dog' styleClass='table' headerClass='tableColumnsHeader' rowClasses='tableFirstLine,tableNextLine' ><h:column><f:facet name='header'>#{msgs.dogName}</f:facet>#{dog.name}</h:column><h:column><f:facet name='header'>#{msgs.dogWeight}</f:facet>#{dog.weight}</h:column><h:column><h:panelGrid columns='2'><!-- Always save the id as hidden when you use a request scope MB --><h:inputHidden value='#{dog.id}' /><h:commandButton action='#{dogMB.updateDogStart()}' value='#{msgs.update}' rendered='#{userMB.userAdmin}' ><f:setPropertyActionListener target='#{dogMB.dog}' value='#{dog}' /></h:commandButton><h:commandButton action='#{dogMB.deleteDogStart()}' value='#{msgs.delete}' rendered='#{userMB.userAdmin}' ><f:setPropertyActionListener target='#{dogMB.dog}' value='#{dog}' /></h:commandButton></h:panelGrid></h:column></h:dataTable><!-- This button is displayed to the user, just to you see the error msg  --><h:commandButton action='createDog' value='#{msgs.create} #{msgs.dog}' /></h:form>
</h:body>
</html>

关于上面的代码:

  • 永远记得用h:form标记包装代码。 如果没有h:form,h:head和h:body,有些框架(例如Primefaces)将无法工作。
  • 我们使用UserMB来显示用户名并注销我们的用户。
  • <h:messages />标记将显示DogMB发送的消息。
  • 请注意,第33行的ID被隐藏。 如果您使用RequestScope而不是SessionScope,则这是一个必需的值。 我宁愿使用RequestScope也不使用SessionScope,因为服务器内存中的数据更少。
  • 请注意,按钮的呈现方式为=“#{userMB.userAdmin}”,以指示仅ADMIN角色有权访问删除/更新。
  • 我通过标签“ f:setPropertyActionListener ”将选定的狗传递给我的MB。
  • “创建”按钮没有渲染选项。 如果普通用户尝试访问页面,它只是向您显示。

/WebContent/pages/protected/admin/createDog.xhtml

<!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:f='http://java.sun.com/jsf/core'xmlns:h='http://java.sun.com/jsf/html'xmlns:ui='http://java.sun.com/jsf/facelets'>
<h:head><h:outputStylesheet library='css' name='main.css' />
</h:head>
<h:body><h:form><h:messages/><h3>${msgs.dogCreateHeader}</h3><h:panelGrid columns='2' styleClass='panelGrid' rowClasses='panelFirstLine,panelNextLine' ><h:outputLabel for='dogName' value='#{msgs.dogName}' /><h:inputText id='dogName' value='#{dogMB.dog.name}' required='true' requiredMessage='#{msgs.dogNameRequired}' /><h:outputLabel for='dogWeight' value='#{msgs.dogWeight}' /><h:inputText id='dogWeight' value='#{dogMB.dog.weight}' required='true' requiredMessage='#{msgs.dogWeightRequired}' ><f:convertNumber /></h:inputText></h:panelGrid><h:panelGrid columns='2'><h:commandButton action='#{dogMB.createDogEnd()}' value='#{msgs.create}' /><h:commandButton action='#{dogMB.listAllDogs()}' value='#{msgs.cancel}' immediate='true' /></h:panelGrid><br/></h:form>
</h:body>
</html>

关于上面的代码:

  • 字段名称和权重是必填字段,如果将其保留为空,则会显示一条错误消息。
  • 取消按钮需要选项Instant =“ true”; 使用此选项,JSF将不会验证任何字段。

/WebContent/pages/protected/admin/deleteDog.xhtml

<!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:f='http://java.sun.com/jsf/core'xmlns:h='http://java.sun.com/jsf/html'xmlns:ui='http://java.sun.com/jsf/facelets'>
<h:head><h:outputStylesheet library='css' name='main.css' />
</h:head>
<h:body><h:form><h:messages/><h3>#{msgs.dogDeleteHeader}: #{dogMB.dog.name}?</h3><h:inputHidden value='#{dogMB.dog.id}' /><h:panelGrid columns='2'><h:commandButton action='#{dogMB.deleteDogEnd()}' value='#{msgs.delete}' /><h:commandButton action='#{dogMB.listAllDogs()}' value='#{msgs.cancel}' immediate='true' /></h:panelGrid><br/></h:form>
</h:body>
</html>

请注意,在第15行中,该ID是隐藏的。 如果您使用RequestScope而不是SessionScope,则这是一个必需的值。 我宁愿使用RequestScope也不使用SessionScope,因为服务器内存中的数据更少。

/WebContent/pages/protected/admin/updateDog.xhtm l

<!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:f='http://java.sun.com/jsf/core'xmlns:h='http://java.sun.com/jsf/html'xmlns:ui='http://java.sun.com/jsf/facelets'>
<h:head><h:outputStylesheet library='css' name='main.css' />
</h:head>
<h:body><h:form><h:messages/><h3>#{msgs.dogUpdateHeader}: #{dogMB.dog.name}</h3><h:inputHidden value='#{dogMB.dog.id}' /><h:panelGrid columns='2' styleClass='panelGrid' rowClasses='panelFirstLine,panelNextLine' ><h:outputLabel for='dogName' value='#{msgs.dogName}' /><h:inputText id='dogName' value='#{dogMB.dog.name}' required='true' requiredMessage='#{msgs.dogNameRequired}' /><h:outputLabel for='dogWeight' value='#{msgs.dogWeight}' /><h:inputText id='dogWeight' value='#{dogMB.dog.weight}' required='true' requiredMessage='#{msgs.dogWeightRequired}' ><f:convertNumber /></h:inputText></h:panelGrid><h:panelGrid columns='2'><h:commandButton action='#{dogMB.updateDogEnd()}' value='#{msgs.update}' /><h:commandButton action='#{dogMB.listAllDogs()}' value='#{msgs.cancel}' immediate='true' /></h:panelGrid><br/></h:form>
</h:body>
</html>

关于上面的代码:

  • 请注意,在第15行中,该ID是隐藏的。 如果您使用RequestScope而不是SessionScope,则这是一个必需的值。 我宁愿使用RequestScope也不使用SessionScope,因为服务器内存中的数据更少。
  • 字段名称和权重是必填字段,如果将其保留为空,则会显示一条错误消息。
  • 取消按钮需要选项Instant =“ true”; 使用此选项,JSF将不会验证任何字段。

查看– JBoss 7 JAAS配置

现在,我们只需要完成一些步骤即可完成我们的软件(最后!)。

我们需要编辑JBoss配置并添加我们的JAAS配置。

再次打开文件“ YOUR_JBOSS / standalone / configuration / standalone.xml ”,然后搜索密钥:“ <security-domains>”。 添加下面的代码(在这篇文章中,我演示如何为JBoss 6 – 使用JAAS和JSF进行用户登录验证 )进行设置:

<subsystem xmlns='urn:jboss:domain:security:1.0'><security-domains><!-- add me: begin --><security-domain name='CrudJSFRealm' cache-type='default'><authentication><login-module code='org.jboss.security.auth.spi.DatabaseServerLoginModule' flag='required'><module-option name='dsJndiName' value='CrudDS'/><module-option name='principalsQuery' value='select password from users where email=?' /><module-option name='rolesQuery' value='select role, 'Roles' from users u where u.email=?' /></login-module></authentication></security-domain><!-- add me: end --><!-- Other data... --></security-domains>
</subsystem>

运行我们的应用程序

让我们创建一个EAR来统一我们的项目。

文件>新建>其他> EnterpriseApplication项目

我们只需要在我们的JBoss中添加EAR。

让我们运行我们的应用程序。 启动JBoss并通过以下URL访问我们的应用程序: http:// localhost:8080 / CrudJSF / 。

我使用简单CSS编写了页面,以使理解更加容易。

以USER身份登录,您将不会看到更新/删除按钮; 您只会看到我们留在此处的“创建”按钮,只是为了查看非法访问的例外情况。

看一下我们的页面:

记录为ADMIN:

以USER身份登录:

今天就这些

要下载此帖子的源代码, 请单击此处 。

希望这篇文章对您有所帮助。

如果您有任何疑问或评论,请在下面将其发布。

再见。 \ o_

对我有帮助的链接:

http://7thursdays.wordpress.com/2008/03/18/dependency-injection-in-jboss-42-hold-your-excitement/

http://jan.zawodny.pl/blog/2011/07/jboss-7-postgresql-9

http://blog.xebia.com/2011/07/19/developing-a-jpa-application-on-jboss-as-7/

http://community.jboss.org/wiki/DataSourceConfigurationInAS7

http://stackoverflow.com/questions/286686/how-to-create-conditions-based-on-user-role-using-jsf-myfaces/

http://www.mkyong.com/jsf2/jsf-2-datatable-example/

参考: uaiHebert博客上来自我们的JCG合作伙伴 Hebert Coelho的完整WebApplication JSF EJB JPA JAAS 。


翻译自: https://www.javacodegeeks.com/2012/06/full-webapplication-jsf-ejb-jpa-jaas_19.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android使用绘图Path总结

Path作为Android中一种相对复杂的绘图方式&#xff0c;官方文档中的有些解释并不是很好理解&#xff0c;这里作一个相对全面一些的总结&#xff0c;供日后查看&#xff0c;也分享给大家&#xff0c;共同进步。 1.基本绘图方法 addArc(RectF oval, float startAngle, float swee…

2017.3.23下午

下午通过对OSPF基本原理进一步的学习&#xff0c;对上午学习的内容进行了复习。 转载于:https://www.cnblogs.com/bgd140206206/p/6606192.html

编写Eclipse插件教程–第1部分

Eclipse是三个最受欢迎的Java开发IDE之一。 其成功的原因之一是其可扩展性。 对于任何知道该怎么做并且已经做到的人来说&#xff0c;编写eclipse插件都可以非常轻松快捷。 不幸的是&#xff0c;第一次在Eclipse中进行操作可能会非常耗时且令人沮丧。 Eclipse框架非常庞大&…

简单Window下 Android Studio的安装

&#xff08;1&#xff09;首先安装JDK 下载JDK 本人觉得官方网站下JDK比较慢&#xff0c;可以直接百度JDK&#xff0c;&#xff08;如果是64位 百度搜索记得64位&#xff09; 类似于这样的下载 安装可以看下教程&#xff0c;包括环境变量的配置 如何安装JDK &#xff08;2&…

日期处理一之NSLalendar的使用

一、日期和时间模式 日期和时间格式由日期和时间模式字符串组成&#xff0c;在日期和时间模式字符串中未加引号的A到‘Z’和a到‘z’被解释为模式字母&#xff0c;用来表示日期或时间。字符串元素&#xff0c;文本可以使用单引号&#xff08;‘’&#xff09;引起来使用。定义以…

十大最受欢迎的新Eclipse插件

Eclipse Marketplace仍然是发现有趣且相关的Eclipse插件的地方。 通过Eclipse Marketplace客户端&#xff0c;每月成功安装100,000多个基于Eclipse的产品。 我们提供了过去30天 以来所有时间最受欢迎的插件列表。 我认为看看过去12个月中最受欢迎的新插件会很有趣。 以下列出了…

《Java技术》第二次作业计科1501赵健宇

&#xff08;一&#xff09;学习总结 1.使用Eclipse关联jdk源代码,查看String类的equals&#xff08;&#xff09;方法 equals&#xff08;&#xff09;方法截图 “”比较的是地址。equals方法他同样使用号进行内存地址的比较。但是equals方法重写如果号比较不相等&#xff0c;…

JUnit的内置Hamcrest Core Matcher支持

在用JUnit和Hamcrest改进assertEquals的文章中&#xff0c;我简要讨论了Hamcrest “ 核心 ”匹配器与JUnit的现代版本“结合”在一起的情况。 在那篇文章中&#xff0c;我特别关注了JUnit的assertThat&#xff08;T&#xff0c;Matcher&#xff09;静态方法与Hamcrest核心is()匹…

Java开发高性能网站需要关注的事

转自&#xff1a;http://www.javabloger.com/java-development-concern-those-things/ 近期各家IT媒体举办的业内技术大会让很多网站都在披露自己的技术内幕与同行们分享&#xff0c;大到facebook&#xff0c;百度&#xff0c;小到刚起步的网站。facebook&#xff0c;百度之类的…

并发–顺序线程和原始线程

我不久前参与了一个项目&#xff0c;该项目的报告流程如下&#xff1a; 用户会要求举报 报告要求将被翻译成较小的部分 每个零件的报告将基于零件/节的类型由报告生成器生成 组成报告的各个部分将重新组合成最终报告&#xff0c;并返回给用户 我的目标是展示如何从错误的实…

linux夏令时配置文件,Linux夏令时是怎么调整的?

以法国巴黎为例&#xff1a;root121 zoneinfo]# ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime[root121 zoneinfo]# date2015年 10月 13日 星期二 03:45:09 CEST[root121 zoneinfo]# date -RTue, 13 Oct 2015 03:45:31 0200[root121 zoneinfo]# zdump -v /etc/localt…

Kali Linux渗透基础知识整理(二)漏洞扫描

Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量NmapHping3NessuswhatwebDirBusterjoomscanWPScan网络流量 网络流量就是网络上传输的数据量。 TCP协议 TCP是因特网中的传输层协议&#xff0c;使用三次握手协议建立连接。当主动方发出SYN连接请求后&#xff0c;等待…

嵌入式软件设计第09实验报告

学号&#xff1a;140201133 姓名&#xff1a;李宇昕 组别&#xff1a;第3组 实验地点&#xff1a;D19 一、实验目的&#xff1a; 1.熟悉WWW技术中的SSI&#xff08;Server Side Include&#xff09;技术。 2.学会使用SSI技术编写代码把当前开发板内…

TeamCity工件:HTTP,Ant,Gradle和Maven

您可以通过几种方式检索TeamCity工件&#xff1f; 我说有很多选择 &#xff01; 如果您使用的是Java构建工具&#xff0c;那么可以使用简单的HTTP请求&#xff0c;Ant Ivy&#xff0c;Gradle和Maven下载和使用TeamCity构建配置生成的二进制文件。 怎么样&#xff1f; 继续阅读…

AutoCAD如何方便截图放到Word文档,改成白底黑字

将模型视图切换到布局2即可 比如下图所示的效果 先回到模型视图把所有线条颜色都改成白色&#xff0c;然后添加适当的标注&#xff08;比如要受力分析&#xff0c;则在CAD中绘制箭头也很方便的&#xff09;&#xff0c;文字说明。然后切换到布局2就OK 可以截图了。 转载于:http…

iOS--支付宝环境集成

1.下载支付宝SDK以及Demo https://doc.open.alipay.com/doc2/detail?treeId54&articleId103419&docType1 2.新建文件夹“AliSDK”&#xff0c;将压缩包内的文件拷贝到该文件夹下&#xff0c;完成后如下图所示&#xff1a; 3.将文件夹拷贝到项目中&#xff0c; 4.执行完…

Java EE 6测试第二部分– Arquillian和ShrinkWrap简介

在Java EE 6测试的第一部分中&#xff0c;我简要介绍了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API&#xff0c;以演示如何启动该容器&#xff0c;如何在项目类路径中查找bean以及运行非常简单的集成测试。 这篇文章重点介绍Arquillian和ShrinkWrap以及为什么它们是用于企…

【腾讯Bugly干货分享】Android内存优化总结实践

本文来自于腾讯Bugly公众号&#xff08;weixinBugly&#xff09;&#xff0c;未经作者同意&#xff0c;请勿转载&#xff0c;原文地址&#xff1a;https://mp.weixin.qq.com/s/2MsEAR9pQfMr1Sfs7cPdWQ 导语 智能手机发展到今天已经有十几个年头&#xff0c;手机的软硬件都已经发…

令人印象深刻的第一个Apache Camel版本

为了准备下周的CamelOne会议&#xff0c;我花了一些时间回顾一下Apache Camel项目的历史。 因此&#xff0c;除其他外&#xff0c;我了解了Apache Camel的第一个正式1.0版本 。 Apache Camel 1.0 – 5年前 我看的越多&#xff0c;这个版本的事实给我留下了深刻的印象。 现在您…

为什么在2012/2013年我将在新的Enterprise Java项目中继续使用Spring *和* Java EE

自从我担任技术决策职务以来已经过去了一年多&#xff0c;很高兴看到我仍然与之保持着完美的和谐。 几个月前&#xff0c;我在KaiWhner的一个不错的博客中写了一个有关JEE与Spring的答案。 如果观点没有不同&#xff0c;那么讨论的附加值在哪里&#xff1f; 我确实同意Kai的许多…